@@ -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.
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -51,3 +51,4 @@
|
||||
|
||||
tile_overlay = "sleeping_agent"
|
||||
overlay_limit = 1
|
||||
flags = XGM_GAS_OXIDIZER
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,5 +1,5 @@
|
||||
/obj/machinery/microwave
|
||||
name = "Microwave"
|
||||
name = "microwave"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "mw"
|
||||
layer = 2.9
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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!
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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"
|
||||
/*
|
||||
///////////////////////////////////
|
||||
/ =---------------------------= /
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 603 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.4 KiB |