@@ -290,6 +290,10 @@
|
||||
#define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes
|
||||
#define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling
|
||||
|
||||
#define COMSIG_LIVING_BIOLOGICAL_LIFE "biological_life" //from base of mob/living/BiologicalLife() (seconds, times_fired)
|
||||
|
||||
#define COMSIG_LIVING_PHYSICAL_LIFE "physical_life" //from base of mob/living/PhysicalLife() (seconds, times_fired)
|
||||
|
||||
// /mob/living/carbon physiology signals
|
||||
#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
|
||||
#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#define TOXIC (1<<11)
|
||||
#define PINEAPPLE (1<<12)
|
||||
#define BREAKFAST (1<<13)
|
||||
#define ANTITOXIC (1<<14)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
|
||||
@@ -54,3 +54,16 @@
|
||||
|
||||
//donator items
|
||||
#define LOADOUT_CATEGORY_DONATOR "Donator"
|
||||
|
||||
//how many prosthetics can we have
|
||||
#define MAXIMUM_LOADOUT_PROSTHETICS 2
|
||||
|
||||
//what limbs can be amputated or be prosthetic
|
||||
#define LOADOUT_ALLOWED_LIMB_TARGETS list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)
|
||||
|
||||
//options for modifiying limbs
|
||||
#define LOADOUT_LIMB_NORMAL "Normal"
|
||||
#define LOADOUT_LIMB_PROSTHETIC "Prosthetic"
|
||||
#define LOADOUT_LIMB_AMPUTATED "Amputated"
|
||||
|
||||
#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though
|
||||
@@ -279,7 +279,8 @@ GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
|
||||
//parts in either of the above two lists that require a second option that allows them to be coloured
|
||||
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
|
||||
|
||||
//species ids that have greyscale sprites
|
||||
//body ids that have greyscale sprites
|
||||
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic"))
|
||||
|
||||
//species ids that need snowflake coloring applied
|
||||
//body ids that have prosthetic sprites
|
||||
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
|
||||
|
||||
@@ -396,6 +396,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
SSjob.EquipRank(N, player.mind.assigned_role, 0)
|
||||
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
|
||||
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
|
||||
N.client.prefs.post_copy_to(player)
|
||||
CHECK_TICK
|
||||
if(captainless)
|
||||
for(var/mob/dead/new_player/N in GLOB.player_list)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
A.AddElement(/datum/element/update_icon_updates_onmob)
|
||||
RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
|
||||
if(suits_with_helmet_typecache[A.type])
|
||||
RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet)
|
||||
RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) //you better work now you slut
|
||||
else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
|
||||
var/datum/action/polychromic/P = new(A)
|
||||
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
|
||||
@@ -166,6 +166,15 @@
|
||||
examine_list += "<span class='notice'>Alt-click to recolor it.</span>"
|
||||
|
||||
/datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H)
|
||||
if(!isitem(H)) //backup in case if it messes up somehow
|
||||
if(istype(source,/obj/item/clothing/suit/hooded)) //so how come it be like this, where toggleable headslots are named separately (helmet/hood) anyways?
|
||||
var/obj/item/clothing/suit/hooded/sourcesuit = source
|
||||
H = sourcesuit.hood
|
||||
else if(istype(source,/obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/sourcesuit = source
|
||||
H = sourcesuit.helmet
|
||||
else
|
||||
return
|
||||
suit_by_helmet[H] = source
|
||||
helmet_by_suit[source] = H
|
||||
colors_by_atom[H] = colors_by_atom[source]
|
||||
|
||||
@@ -285,6 +285,17 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
beauty_modifier = -0.15
|
||||
texture_layer_icon_state = "runed"
|
||||
|
||||
/datum/material/brass
|
||||
name = "brass"
|
||||
desc = "Tybel gb-Ratvar"
|
||||
color = "#917010"
|
||||
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
strength_modifier = 1.3 // Replicant Alloy is very good for skull beatings..
|
||||
sheet_type = /obj/item/stack/tile/brass
|
||||
value_per_unit = 0.75
|
||||
armor_modifiers = list("melee" = 1.4, "bullet" = 1.4, "laser" = 0, "energy" = 0, "bomb" = 1.4, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) //But it has.. a few problems that can't easily be compensated for.
|
||||
beauty_modifier = 0.3 //It really beats the cold plain plating of the station, doesn't it?
|
||||
|
||||
/datum/material/bronze
|
||||
name = "bronze"
|
||||
desc = "Clock Cult? Never heard of it."
|
||||
|
||||
@@ -204,6 +204,11 @@
|
||||
mood_change = -1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/plush_bite
|
||||
description = "<span class='warning'>IT BIT ME!! OW!</span>\n"
|
||||
mood_change = -3
|
||||
timeout = 2 MINUTES
|
||||
|
||||
//Cursed stuff below
|
||||
|
||||
/datum/mood_event/emptypred
|
||||
|
||||
@@ -211,24 +211,27 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/paraplegic/on_spawn()
|
||||
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
|
||||
quirk_holder.buckled.unbuckle_mob(quirk_holder)
|
||||
if(quirk_holder.client)
|
||||
var/modified_limbs = quirk_holder.client.prefs.modified_limbs
|
||||
if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !isjellyperson(quirk_holder)))
|
||||
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
|
||||
quirk_holder.buckled.unbuckle_mob(quirk_holder)
|
||||
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
var/obj/structure/chair/spawn_chair = locate() in T
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
var/obj/structure/chair/spawn_chair = locate() in T
|
||||
|
||||
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
|
||||
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
|
||||
wheels.setDir(spawn_chair.dir)
|
||||
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
|
||||
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
|
||||
wheels.setDir(spawn_chair.dir)
|
||||
|
||||
wheels.buckle_mob(quirk_holder)
|
||||
wheels.buckle_mob(quirk_holder)
|
||||
|
||||
// During the spawning process, they may have dropped what they were holding, due to the paralysis
|
||||
// So put the things back in their hands.
|
||||
// During the spawning process, they may have dropped what they were holding, due to the paralysis
|
||||
// So put the things back in their hands.
|
||||
|
||||
for(var/obj/item/I in T)
|
||||
if(I.fingerprintslast == quirk_holder.ckey)
|
||||
quirk_holder.put_in_hands(I)
|
||||
for(var/obj/item/I in T)
|
||||
if(I.fingerprintslast == quirk_holder.ckey)
|
||||
quirk_holder.put_in_hands(I)
|
||||
|
||||
/datum/quirk/poor_aim
|
||||
name = "Poor Aim"
|
||||
@@ -244,42 +247,6 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
mob_trait = TRAIT_PROSOPAGNOSIA
|
||||
medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces."
|
||||
|
||||
/datum/quirk/prosthetic_limb
|
||||
name = "Prosthetic Limb"
|
||||
desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!"
|
||||
value = -1
|
||||
var/slot_string = "limb"
|
||||
|
||||
/datum/quirk/prosthetic_limb/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/limb_slot
|
||||
if(HAS_TRAIT(H, TRAIT_PARA))//Prevent paraplegic legs being replaced
|
||||
limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
|
||||
else
|
||||
limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot)
|
||||
var/obj/item/bodypart/prosthetic
|
||||
switch(limb_slot)
|
||||
if(BODY_ZONE_L_ARM)
|
||||
prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder)
|
||||
slot_string = "left arm"
|
||||
if(BODY_ZONE_R_ARM)
|
||||
prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder)
|
||||
slot_string = "right arm"
|
||||
if(BODY_ZONE_L_LEG)
|
||||
prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder)
|
||||
slot_string = "left leg"
|
||||
if(BODY_ZONE_R_LEG)
|
||||
prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder)
|
||||
slot_string = "right leg"
|
||||
prosthetic.replace_limb(H)
|
||||
qdel(old_part)
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/quirk/prosthetic_limb/post_add()
|
||||
to_chat(quirk_holder, "<span class='boldannounce'>Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
|
||||
you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.</span>")
|
||||
|
||||
/datum/quirk/insanity
|
||||
name = "Reality Dissociation Syndrome"
|
||||
desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. <b>This is not a license to grief.</b>"
|
||||
|
||||
@@ -178,9 +178,12 @@
|
||||
table[y1][x1] += 10
|
||||
if(href_list["same_board"]) //Reset the board... kinda
|
||||
if(game_status != MINESWEEPER_GAME_PLAYING)
|
||||
mine_sound = TRUE
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
if(table[y1][x1] >= 10) //If revealed, become unrevealed!
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
if(mine_sound)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
mine_sound = FALSE
|
||||
table[y1][x1] -= 10
|
||||
if(table[y1][x1] > 10 && !reset_board)
|
||||
safe_squares_revealed += 1
|
||||
|
||||
@@ -38,3 +38,14 @@
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
drive()
|
||||
|
||||
/obj/machinery/mass_driver/pressure_plate
|
||||
name = "pressure plated mass driver"
|
||||
var/drive_delay = 10
|
||||
|
||||
/obj/machinery/mass_driver/pressure_plate/Crossed(atom/movable/O)
|
||||
. = ..()
|
||||
if(isliving(O))
|
||||
var/mob/living/L = O
|
||||
to_chat(L, "<span class='warning'>You feel something click beneath you!</span>")
|
||||
addtimer(CALLBACK(src, .proc/drive), drive_delay)
|
||||
@@ -255,7 +255,7 @@
|
||||
/obj/item/choice_beacon/box/plushie/generate_display_names()
|
||||
var/list/plushie_list = list()
|
||||
//plushie set 1: just subtypes of /obj/item/toy/plush
|
||||
var/list/plushies_set_one = subtypesof(/obj/item/toy/plush) - list(/obj/item/toy/plush/narplush, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random_snowflake, /obj/item/toy/plush/random) //don't allow these special ones (you can still get narplush/hugbox)
|
||||
var/list/plushies_set_one = subtypesof(/obj/item/toy/plush) - list(/obj/item/toy/plush/narplush, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random_snowflake, /obj/item/toy/plush/plushling, /obj/item/toy/plush/random) //don't allow these special ones (you can still get narplush/hugbox)
|
||||
for(var/V in plushies_set_one)
|
||||
var/atom/A = V
|
||||
plushie_list[initial(A.name)] = A
|
||||
@@ -272,4 +272,3 @@
|
||||
icon_state = "skub"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("skubbed")
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
return
|
||||
log_game("[key_name(user)] activated a hidden grenade in [src].")
|
||||
grenade.preprime(user, msg = FALSE, volume = 10)
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You try to pet [src], but it has no stuffing. Aww...</span>")
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
|
||||
@@ -754,8 +754,8 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/toy/plush/hairball
|
||||
name = "Hairball"
|
||||
desc = "A bundle of undigested fibers and scales. Yuck."
|
||||
@@ -765,3 +765,78 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
squeak_override = list('sound/misc/splort.ogg'=1)
|
||||
attack_verb = list("sploshed", "splorted", "slushed")
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/plushling
|
||||
name = "peculiar plushie"
|
||||
desc = "An adorable stuffed toy- wait, did it just move?"
|
||||
can_random_spawn = FALSE
|
||||
var/absorb_cooldown = 100 //ticks cooldown between absorbs
|
||||
var/next_absorb = 0 //When can it absorb another plushie
|
||||
var/check_interval = 20
|
||||
var/next_check = 0
|
||||
|
||||
//Overrides parent proc
|
||||
/obj/item/toy/plush/plushling/attack_self(mob/user)
|
||||
if(!user) //hmmmmm
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You try to pet the plushie, but recoil as it bites your hand instead! OW!</span>")
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_bite", /datum/mood_event/plush_bite)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H)
|
||||
return //Type safety.
|
||||
H.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
|
||||
addtimer(CALLBACK(H, /mob/living/carbon/human.proc/dropItemToGround, src, TRUE), 1)
|
||||
|
||||
/obj/item/toy/plush/plushling/New()
|
||||
var/initial_state = pick("plushie_lizard", "plushie_snake", "plushie_slime", "fox")
|
||||
icon_state = initial_state
|
||||
item_state = initial_state
|
||||
START_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/toy/plush/plushling/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/toy/plush/plushling/process()
|
||||
if(world.time < next_absorb || world.time < next_check)
|
||||
return
|
||||
next_check = world.time + check_interval
|
||||
var/obj/item/toy/plush/target
|
||||
for(var/obj/item/toy/plush/possible_target in loc) //First, it tries to get anything in its same location, be it a tile or a backpack
|
||||
if(possible_target == src || istype(possible_target, /obj/item/toy/plush/plushling))
|
||||
continue
|
||||
target = possible_target
|
||||
break
|
||||
if(!target)
|
||||
if(!isturf(loc))
|
||||
return
|
||||
for(var/obj/item/toy/plush/P in oview(1, src)) //If that doesn't work, it hunts for plushies adjacent to its own tile
|
||||
if(istype(P, /obj/item/toy/plush/plushling)) //These do not hunt their own kind
|
||||
continue
|
||||
src.throw_at(P, 1, 2)
|
||||
visible_message("<span class='danger'>[src] leaps at [P]!</span>")
|
||||
break
|
||||
return
|
||||
if(istype(target, /obj/item/toy/plush/plushling)) //These do not consume their own.
|
||||
return
|
||||
next_absorb = world.time + absorb_cooldown
|
||||
plushie_absorb(target)
|
||||
|
||||
/obj/item/toy/plush/plushling/proc/plushie_absorb(obj/item/toy/plush/victim)
|
||||
if(!victim)
|
||||
return
|
||||
visible_message("<span class='warning'>[src] gruesomely mutilliates [victim], leaving nothing more than dust!</span>")
|
||||
name = victim.name
|
||||
desc = victim.desc + " Wait, did it just move..?"
|
||||
icon_state = victim.icon_state
|
||||
item_state = victim.item_state
|
||||
squeak_override = victim.squeak_override
|
||||
attack_verb = victim.attack_verb
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(victim))
|
||||
qdel(victim)
|
||||
|
||||
/obj/item/toy/plush/plushling/love(obj/item/toy/plush/Kisser, mob/living/user) //You shouldn't have come here, poor plush.
|
||||
if(!Kisser)
|
||||
return
|
||||
plushie_absorb(Kisser)
|
||||
|
||||
@@ -636,7 +636,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/bottle/holyoil/empty), \
|
||||
new/datum/stack_recipe("brass smith's hammer", /obj/item/melee/smith/hammer/ratvar, 6), \
|
||||
new/datum/stack_recipe("brass ingot", /obj/item/ingot/bronze/ratvar, 6, time = 100), \
|
||||
new/datum/stack_recipe("brass ingot", /obj/item/ingot/ratvar, 6, time = 100), \
|
||||
))
|
||||
|
||||
/obj/item/stack/tile/brass
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
if(owner.current.gender == MALE)
|
||||
if(prob(10)) // Gender override
|
||||
bloodsucker_reputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King")
|
||||
else
|
||||
else if(owner.current.gender == FEMALE)
|
||||
if(prob(10)) // Gender override
|
||||
bloodsucker_reputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen")
|
||||
|
||||
@@ -341,10 +341,12 @@
|
||||
|
||||
//This handles the application of antag huds/special abilities
|
||||
/datum/antagonist/bloodsucker/apply_innate_effects(mob/living/mob_override)
|
||||
RegisterSignal(owner.current,COMSIG_LIVING_BIOLOGICAL_LIFE,.proc/LifeTick)
|
||||
return
|
||||
|
||||
//This handles the removal of antag huds/special abilities
|
||||
/datum/antagonist/bloodsucker/remove_innate_effects(mob/living/mob_override)
|
||||
UnregisterSignal(owner.current,COMSIG_LIVING_BIOLOGICAL_LIFE)
|
||||
return
|
||||
|
||||
//Assign default team and creates one for one of a kind team antagonists
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
B.decoy_override = FALSE
|
||||
remove_changeling_powers()
|
||||
owner.special_role = null
|
||||
owner.current.hud_used?.lingchemdisplay?.invisibility = INVISIBILITY_ABSTRACT
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/changeling/proc/remove_clownmut()
|
||||
@@ -225,6 +226,8 @@
|
||||
else //not dead? no chem/geneticdamage caps.
|
||||
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage)
|
||||
geneticdamage = max(0, geneticdamage-1)
|
||||
owner.current.hud_used?.lingchemdisplay?.invisibility = 0
|
||||
owner.current.hud_used?.lingchemdisplay?.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#dd66dd'>[round(chem_charges)]</font></div>"
|
||||
|
||||
|
||||
/datum/antagonist/changeling/proc/get_dna(dna_owner)
|
||||
@@ -357,10 +360,12 @@
|
||||
B.organ_flags &= ~ORGAN_VITAL
|
||||
B.decoy_override = TRUE
|
||||
update_changeling_icons_added()
|
||||
RegisterSignal(owner.current,COMSIG_LIVING_BIOLOGICAL_LIFE,.proc/regenerate)
|
||||
return
|
||||
|
||||
/datum/antagonist/changeling/remove_innate_effects()
|
||||
update_changeling_icons_removed()
|
||||
UnregisterSignal(owner.current,COMSIG_LIVING_BIOLOGICAL_LIFE)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
/obj/machinery/syndicatebomb/badmin/clown,
|
||||
/obj/machinery/syndicatebomb/empty,
|
||||
/obj/machinery/syndicatebomb/self_destruct,
|
||||
/obj/machinery/syndicatebomb/training
|
||||
/obj/machinery/syndicatebomb/training,
|
||||
/obj/machinery/gravity_generator,
|
||||
/obj/machinery/gravity_generator/main
|
||||
)))
|
||||
|
||||
//The malf AI action subtype. All malf actions are subtypes of this.
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
R.reaction(turfing ? target : target.loc, TOUCH, 1, 0)
|
||||
if(!turfing)
|
||||
R.trans_to(target, R.total_volume * (spill ? G.fluid_transfer_factor : 1))
|
||||
G.time_since_last_orgasm = 0
|
||||
G.last_orgasmed = world.time
|
||||
R.clear_reagents()
|
||||
|
||||
/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
var/fluid_efficiency = 1
|
||||
var/fluid_rate = CUM_RATE
|
||||
var/fluid_mult = 1
|
||||
var/time_since_last_orgasm = 500
|
||||
var/last_orgasmed = 0
|
||||
var/aroused_state = FALSE //Boolean used in icon_state strings
|
||||
var/obj/item/organ/genital/linked_organ
|
||||
var/linked_organ_slot //used for linking an apparatus' organ to its other half on update_link().
|
||||
@@ -24,10 +24,6 @@
|
||||
|
||||
/obj/item/organ/genital/Initialize(mapload, do_update = TRUE)
|
||||
. = ..()
|
||||
if(fluid_id)
|
||||
create_reagents(fluid_max_volume, NONE, NO_REAGENTS_VALUE)
|
||||
if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
|
||||
reagents.add_reagent(fluid_id, fluid_max_volume)
|
||||
if(do_update)
|
||||
update()
|
||||
|
||||
@@ -140,8 +136,6 @@
|
||||
/obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY)
|
||||
fluid_max_volume += modifier*2.5
|
||||
fluid_rate += modifier/10
|
||||
if(reagents)
|
||||
reagents.maximum_volume = fluid_max_volume
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_size()
|
||||
@@ -151,18 +145,14 @@
|
||||
if(!owner || owner.stat == DEAD)
|
||||
aroused_state = FALSE
|
||||
|
||||
/obj/item/organ/genital/on_life()
|
||||
. = ..()
|
||||
if(!reagents || !.)
|
||||
return
|
||||
reagents.maximum_volume = fluid_max_volume
|
||||
if(fluid_id && CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
|
||||
time_since_last_orgasm++
|
||||
|
||||
/obj/item/organ/genital/proc/generate_fluid(datum/reagents/R)
|
||||
var/amount = clamp(fluid_rate * time_since_last_orgasm * fluid_mult,0,fluid_max_volume)
|
||||
var/amount = clamp((fluid_rate * ((world.time - last_orgasmed) / SSmobs.wait) * fluid_mult),0,fluid_max_volume)
|
||||
R.clear_reagents()
|
||||
R.add_reagent(fluid_id,amount)
|
||||
R.maximum_volume = fluid_max_volume
|
||||
if(fluid_id)
|
||||
R.add_reagent(fluid_id,amount)
|
||||
else if(linked_organ?.fluid_id)
|
||||
R.add_reagent(linked_organ.fluid_id,amount)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/genital/proc/update_link()
|
||||
|
||||
@@ -331,6 +331,7 @@
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM))
|
||||
temperature -= heat/heat_capacity
|
||||
temperature = max(temperature,T0C) //otherwise we just sorta get stuck at super cold temps forever
|
||||
|
||||
/turf/open/proc/temperature_share_open_to_solid(turf/sharer)
|
||||
sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity)
|
||||
@@ -344,3 +345,5 @@
|
||||
|
||||
temperature -= heat/heat_capacity
|
||||
sharer.temperature += heat/sharer.heat_capacity
|
||||
temperature = max(temperature,T0C)
|
||||
sharer.temperature = max(sharer.temperature,T0C)
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
/datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location)
|
||||
return NO_REACTION
|
||||
|
||||
/datum/gas_reaction/proc/test()
|
||||
return list("success" = TRUE)
|
||||
|
||||
/datum/gas_reaction/nobliumsupression
|
||||
priority = INFINITY
|
||||
name = "Hyper-Noblium Reaction Suppression"
|
||||
@@ -70,6 +73,8 @@
|
||||
air.adjust_moles(/datum/gas/water_vapor,-MOLES_GAS_VISIBLE)
|
||||
. = REACTING
|
||||
|
||||
// no test cause it's entirely based on location
|
||||
|
||||
//tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic
|
||||
/datum/gas_reaction/tritfire
|
||||
priority = -1 //fire should ALWAYS be last, but tritium fires happen before plasma fires
|
||||
@@ -126,6 +131,18 @@
|
||||
|
||||
return cached_results["fire"] ? REACTING : NO_REACTION
|
||||
|
||||
/datum/gas_reaction/tritfire/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/tritium,50)
|
||||
G.set_moles(/datum/gas/oxygen,50)
|
||||
G.set_temperature(500)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(!G.reaction_results["fire"])
|
||||
return list("success" = FALSE, "message" = "Trit fires aren't setting fire results correctly!")
|
||||
return ..()
|
||||
|
||||
//plasma combustion: combustion of oxygen and plasma (treated as hydrocarbons). creates hotspots. exothermic
|
||||
/datum/gas_reaction/plasmafire
|
||||
priority = -2 //fire should ALWAYS be last, but plasma fires happen after tritium fires
|
||||
@@ -198,6 +215,28 @@
|
||||
|
||||
return cached_results["fire"] ? REACTING : NO_REACTION
|
||||
|
||||
/datum/gas_reaction/plasmafire/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/plasma,50)
|
||||
G.set_moles(/datum/gas/oxygen,50)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(500)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(!G.reaction_results["fire"])
|
||||
return list("success" = FALSE, "message" = "Plasma fires aren't setting fire results correctly!")
|
||||
if(!G.get_moles(/datum/gas/carbon_dioxide))
|
||||
return list("success" = FALSE, "message" = "Plasma fires aren't making CO2!")
|
||||
G.clear()
|
||||
G.set_moles(/datum/gas/plasma,10)
|
||||
G.set_moles(/datum/gas/oxygen,1000)
|
||||
G.set_temperature(500)
|
||||
result = G.react()
|
||||
if(!G.get_moles(/datum/gas/tritium))
|
||||
return list("success" = FALSE, "message" = "Plasma fires aren't making trit!")
|
||||
return ..()
|
||||
|
||||
//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again!
|
||||
//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again.
|
||||
//6 reworks
|
||||
@@ -282,6 +321,31 @@
|
||||
air.set_temperature(clamp(((air.return_temperature()*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY))
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/fusion/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/carbon_dioxide,300)
|
||||
G.set_moles(/datum/gas/plasma,1000)
|
||||
G.set_moles(/datum/gas/tritium,100.61)
|
||||
G.set_moles(/datum/gas/nitryl,1)
|
||||
G.set_temperature(15000)
|
||||
G.set_volume(1000)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(abs(G.analyzer_results["fusion"] - 3) > 0.0000001)
|
||||
var/instability = G.analyzer_results["fusion"]
|
||||
return list("success" = FALSE, "message" = "Fusion is not calculating analyzer results correctly, should be 3.000000045, is instead [instability]")
|
||||
if(abs(G.get_moles(/datum/gas/plasma) - 850.616) > 0.5)
|
||||
var/plas = G.get_moles(/datum/gas/plasma)
|
||||
return list("success" = FALSE, "message" = "Fusion is not calculating plasma correctly, should be 850.616, is instead [plas]")
|
||||
if(abs(G.get_moles(/datum/gas/carbon_dioxide) - 1699.384) > 0.5)
|
||||
var/co2 = G.get_moles(/datum/gas/carbon_dioxide)
|
||||
return list("success" = FALSE, "message" = "Fusion is not calculating co2 correctly, should be 1699.384, is instead [co2]")
|
||||
if(abs(G.return_temperature() - 27600) > 200) // calculating this manually sucks dude
|
||||
var/temp = G.return_temperature()
|
||||
return list("success" = FALSE, "message" = "Fusion is not calculating temperature correctly, should be around 27600, is instead [temp]")
|
||||
return ..()
|
||||
|
||||
/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst.
|
||||
priority = 3
|
||||
name = "Nitryl formation"
|
||||
@@ -313,6 +377,20 @@
|
||||
air.set_temperature(max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB))
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/nitrylformation/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/oxygen,30)
|
||||
G.set_moles(/datum/gas/nitrogen,30)
|
||||
G.set_moles(/datum/gas/nitrous_oxide,10)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(150000)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(!G.get_moles(/datum/gas/nitryl) < 0.8)
|
||||
return list("success" = FALSE, "message" = "Nitryl isn't being generated correctly!")
|
||||
return ..()
|
||||
|
||||
/datum/gas_reaction/bzformation //Formation of BZ by combining plasma and tritium at low pressures. Exothermic.
|
||||
priority = 4
|
||||
name = "BZ Gas formation"
|
||||
@@ -348,6 +426,19 @@
|
||||
air.set_temperature(max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB))
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/bzformation/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/plasma,15)
|
||||
G.set_moles(/datum/gas/nitrous_oxide,15)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(10)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(!G.get_moles(/datum/gas/bz) < 4) // efficiency is 4.0643 and bz generation == efficiency
|
||||
return list("success" = FALSE, "message" = "Nitryl isn't being generated correctly!")
|
||||
return ..()
|
||||
|
||||
/datum/gas_reaction/stimformation //Stimulum formation follows a strange pattern of how effective it will be at a given temperature, having some multiple peaks and some large dropoffs. Exo and endo thermic.
|
||||
priority = 5
|
||||
name = "Stimulum formation"
|
||||
@@ -380,6 +471,23 @@
|
||||
air.set_temperature(max(((air.return_temperature()*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB))
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/stimformation/test()
|
||||
//above mentioned "strange pattern" is a basic quintic polynomial, it's fine, can calculate it manually
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/bz,30)
|
||||
G.set_moles(/datum/gas/plasma,1000)
|
||||
G.set_moles(/datum/gas/tritium,1000)
|
||||
G.set_moles(/datum/gas/nitryl,1000)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(12998000) // yeah, really
|
||||
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(!G.get_moles(/datum/gas/stimulum) < 900)
|
||||
return list("success" = FALSE, "message" = "Stimulum isn't being generated correctly!")
|
||||
return ..()
|
||||
|
||||
/datum/gas_reaction/nobliumformation //Hyper-Noblium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
|
||||
priority = 6
|
||||
name = "Hyper-Noblium condensation"
|
||||
@@ -408,6 +516,19 @@
|
||||
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
|
||||
air.set_temperature(max(((air.return_temperature()*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB))
|
||||
|
||||
/datum/gas_reaction/nobliumformation/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/nitrogen,100)
|
||||
G.set_moles(/datum/gas/tritium,500)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(5000000) // yeah, really
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
if(abs(G.thermal_energy() - 23000000000) > 1000000) // god i hate floating points
|
||||
return list("success" = FALSE, "message" = "Hyper-nob formation isn't removing the right amount of heat! Should be 23,000,000,000, is instead [G.thermal_energy()]")
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/gas_reaction/miaster //dry heat sterilization: clears out pathogens in the air
|
||||
priority = -10 //after all the heating from fires etc. is done
|
||||
@@ -433,3 +554,20 @@
|
||||
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
|
||||
air.set_temperature(air.return_temperature() + cleaned_air * 0.002)
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
|
||||
/datum/gas_reaction/miaster/test()
|
||||
var/datum/gas_mixture/G = new
|
||||
G.set_moles(/datum/gas/miasma,1)
|
||||
G.set_volume(1000)
|
||||
G.set_temperature(450)
|
||||
var/result = G.react()
|
||||
if(result != REACTING)
|
||||
return list("success" = FALSE, "message" = "Reaction didn't go at all!")
|
||||
G.clear()
|
||||
G.set_moles(/datum/gas/miasma,1)
|
||||
G.set_temperature(450)
|
||||
G.set_moles(/datum/gas/water_vapor,0.5)
|
||||
result = G.react()
|
||||
if(result != NO_REACTION)
|
||||
return list("success" = FALSE, "message" = "Miasma sterilization not stopping due to water vapor correctly!")
|
||||
return ..()
|
||||
|
||||
@@ -163,6 +163,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
)
|
||||
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
|
||||
var/custom_tongue = "default" //if your tongue is to be something other than your races
|
||||
var/modified_limbs = list() //prosthetic/amputated limbs
|
||||
var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
|
||||
|
||||
/// Security record note section
|
||||
@@ -429,12 +430,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Gender:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=gender;task=input'>[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]</a><BR>"
|
||||
if(gender != NEUTER && pref_species.sexes)
|
||||
dat += "<b>Body Model:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=body_model'>[features["body_model"] == MALE ? "Masculine" : "Feminine"]</a><BR>"
|
||||
dat += "<b>Limb Modification:</b><BR>"
|
||||
dat += "<a href='?_src_=prefs;preference=modify_limbs;task=input'>Modify Limbs</a><BR>"
|
||||
for(var/modification in modified_limbs)
|
||||
if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
|
||||
dat += "<b>[modification]: [modified_limbs[modification][2]]</b><BR>"
|
||||
else
|
||||
dat += "<b>[modification]: [modified_limbs[modification][1]]</b><BR>"
|
||||
dat += "<BR>"
|
||||
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.name]</a><BR>"
|
||||
dat += "<b>Custom Species Name:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=custom_species;task=input'>[custom_species ? custom_species : "None"]</a><BR>"
|
||||
dat += "<b>Random Body:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Randomize!</A><BR>"
|
||||
dat += "<b>Always Random Body:</b><a href='?_src_=prefs;preference=all'>[be_random_body ? "Yes" : "No"]</A><BR>"
|
||||
dat += "<br><b>Cycle background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=cycle_bg;task=input'>[bgstate]</a><BR>"
|
||||
|
||||
var/use_skintones = pref_species.use_skintones
|
||||
if(use_skintones)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -1235,6 +1243,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
for(var/V in all_quirks)
|
||||
var/datum/quirk/T = SSquirks.quirks[V]
|
||||
bal -= initial(T.value)
|
||||
for(var/modification in modified_limbs)
|
||||
if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
|
||||
return bal + 1 //max 1 point regardless of how many prosthetics
|
||||
return bal
|
||||
|
||||
/datum/preferences/proc/GetPositiveQuirkCount()
|
||||
@@ -1492,6 +1503,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("cycle_bg")
|
||||
bgstate = next_list_item(bgstate, bgstate_options)
|
||||
|
||||
if("modify_limbs")
|
||||
var/limb_type = input(user, "Choose the limb to modify:", "Character Preference") as null|anything in LOADOUT_ALLOWED_LIMB_TARGETS
|
||||
if(limb_type)
|
||||
var/modification_type = input(user, "Choose the modification to the limb:", "Character Preference") as null|anything in LOADOUT_LIMBS
|
||||
if(modification_type)
|
||||
if(modification_type == LOADOUT_LIMB_PROSTHETIC)
|
||||
var/prosthetic_type = input(user, "Choose the type of prosthetic", "Character Preference") as null|anything in (list("prosthetic") + GLOB.prosthetic_limb_types)
|
||||
if(prosthetic_type)
|
||||
var/number_of_prosthetics = 0
|
||||
for(var/modification in modified_limbs)
|
||||
if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
|
||||
number_of_prosthetics += 1
|
||||
if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS && !(limb_type in modified_limbs && modified_limbs[limb_type][1] == LOADOUT_LIMB_PROSTHETIC))
|
||||
to_chat(user, "<span class='danger'>You can only have up to two prosthetic limbs!</span>")
|
||||
else
|
||||
//save the actual prosthetic data
|
||||
modified_limbs[limb_type] = list(modification_type, prosthetic_type)
|
||||
else
|
||||
if(modification_type == LOADOUT_LIMB_NORMAL)
|
||||
modified_limbs -= limb_type
|
||||
else
|
||||
modified_limbs[limb_type] = list(modification_type)
|
||||
|
||||
if("underwear")
|
||||
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list
|
||||
if(new_underwear)
|
||||
@@ -2478,7 +2512,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
ShowChoices(user)
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE)
|
||||
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE, initial_spawn = FALSE)
|
||||
if(be_random_name)
|
||||
real_name = pref_species.random_name(gender)
|
||||
|
||||
@@ -2573,6 +2607,35 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(custom_speech_verb != "default")
|
||||
character.dna.species.say_mod = custom_speech_verb
|
||||
|
||||
//limb stuff, only done when initially spawning in
|
||||
if(initial_spawn)
|
||||
//delete any existing prosthetic limbs to make sure no remnant prosthetics are left over
|
||||
for(var/obj/item/bodypart/part in character.bodyparts)
|
||||
if(part.status == BODYPART_ROBOTIC)
|
||||
qdel(part)
|
||||
character.regenerate_limbs() //regenerate limbs so now you only have normal limbs
|
||||
for(var/modified_limb in modified_limbs)
|
||||
var/modification = modified_limbs[modified_limb][1]
|
||||
var/obj/item/bodypart/old_part = character.get_bodypart(modified_limb)
|
||||
if(modification == LOADOUT_LIMB_PROSTHETIC)
|
||||
var/obj/item/bodypart/new_limb
|
||||
switch(modified_limb)
|
||||
if(BODY_ZONE_L_ARM)
|
||||
new_limb = new/obj/item/bodypart/l_arm/robot/surplus(character)
|
||||
if(BODY_ZONE_R_ARM)
|
||||
new_limb = new/obj/item/bodypart/r_arm/robot/surplus(character)
|
||||
if(BODY_ZONE_L_LEG)
|
||||
new_limb = new/obj/item/bodypart/l_leg/robot/surplus(character)
|
||||
if(BODY_ZONE_R_LEG)
|
||||
new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character)
|
||||
var/prosthetic_type = modified_limbs[modified_limb][2]
|
||||
if(prosthetic_type != "prosthetic") //lets just leave the old sprites as they are
|
||||
new_limb.icon = file("icons/mob/augmentation/cosmetic_prosthetic/[prosthetic_type].dmi")
|
||||
new_limb.replace_limb(character)
|
||||
qdel(old_part)
|
||||
|
||||
if(length(modified_limbs))
|
||||
character.regenerate_icons()
|
||||
|
||||
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
|
||||
|
||||
@@ -2581,6 +2644,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
|
||||
/datum/preferences/proc/post_copy_to(mob/living/carbon/human/character)
|
||||
//if no legs, and not a paraplegic or a slime, give them a free wheelchair
|
||||
if(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character))
|
||||
if(character.buckled)
|
||||
character.buckled.unbuckle_mob(character)
|
||||
var/turf/T = get_turf(character)
|
||||
var/obj/structure/chair/spawn_chair = locate() in T
|
||||
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
|
||||
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
|
||||
wheels.setDir(spawn_chair.dir)
|
||||
wheels.buckle_mob(character)
|
||||
|
||||
/datum/preferences/proc/get_default_name(name_id)
|
||||
switch(name_id)
|
||||
if("human")
|
||||
|
||||
@@ -514,6 +514,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["scars3"] >> scars_list["3"]
|
||||
S["scars4"] >> scars_list["4"]
|
||||
S["scars5"] >> scars_list["5"]
|
||||
var/limbmodstr
|
||||
S["modified_limbs"] >> limbmodstr
|
||||
if(length(limbmodstr))
|
||||
modified_limbs = safe_json_decode(limbmodstr)
|
||||
else
|
||||
modified_limbs = list()
|
||||
S["chosen_limb_id"] >> chosen_limb_id
|
||||
S["hide_ckey"] >> hide_ckey //saved per-character
|
||||
|
||||
@@ -845,8 +851,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
|
||||
|
||||
WRITE_FILE(S["chosen_limb_id"], chosen_limb_id)
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
|
||||
@@ -874,6 +878,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["scars3"] , scars_list["3"])
|
||||
WRITE_FILE(S["scars4"] , scars_list["4"])
|
||||
WRITE_FILE(S["scars5"] , scars_list["5"])
|
||||
if(islist(modified_limbs))
|
||||
WRITE_FILE(S["modified_limbs"] , safe_json_encode(modified_limbs))
|
||||
WRITE_FILE(S["chosen_limb_id"], chosen_limb_id)
|
||||
|
||||
|
||||
//gear loadout
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
var/obj/item/clothing/head/hooded/hood
|
||||
var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this
|
||||
|
||||
/obj/item/clothing/suit/hooded/New()
|
||||
/obj/item/clothing/suit/hooded/Initialize()
|
||||
. = ..()
|
||||
hood = MakeHelmet()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/hooded/Destroy()
|
||||
. = ..()
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/obj/item/clothing/suit/hooded/update_icon_state()
|
||||
icon_state = "[initial(icon_state)]"
|
||||
if(ishuman(hood.loc))
|
||||
if(ishuman(hood?.loc))
|
||||
var/mob/living/carbon/human/H = hood.loc
|
||||
if(H.head == hood)
|
||||
icon_state += "_t"
|
||||
@@ -131,8 +131,8 @@
|
||||
|
||||
//Hardsuit toggle code
|
||||
/obj/item/clothing/suit/space/hardsuit/Initialize()
|
||||
helmet = MakeHelmet()
|
||||
. = ..()
|
||||
helmet = MakeHelmet()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/Destroy()
|
||||
if(helmet)
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
slices_num = 5
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
|
||||
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/lime
|
||||
name = "lime cake slice"
|
||||
@@ -141,7 +141,7 @@
|
||||
icon_state = "limecake_slice"
|
||||
filling_color = "#00FF00"
|
||||
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/lemon
|
||||
name = "lemon cake"
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
icon_state = "lime_sc"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/limejuice = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "limes" = 5)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/lemon
|
||||
name = "lemon snowcone"
|
||||
@@ -191,7 +191,7 @@
|
||||
icon_state = "fruitsalad_sc"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/lemonjuice = 5, /datum/reagent/consumable/limejuice = 5, /datum/reagent/consumable/orangejuice = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "oranges" = 5, "limes" = 5, "lemons" = 5, "citrus" = 5, "salad" = 5)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pineapple
|
||||
name = "pineapple snowcone"
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //lollipop, but vitamins = toxins
|
||||
filling_color = "#00800"
|
||||
tastes = list("cobwebs" = 1, "sugar" = 2)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
foodtype = JUNKFOOD | SUGAR | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tobiko
|
||||
name = "tobiko"
|
||||
@@ -451,7 +451,7 @@
|
||||
var/mutable_appearance/head
|
||||
var/headcolor = rgb(0, 0, 0)
|
||||
tastes = list("candy" = 1)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
foodtype = JUNKFOOD | SUGAR | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/lollipop/Initialize()
|
||||
. = ..()
|
||||
@@ -756,4 +756,4 @@
|
||||
bitesize = 2
|
||||
name = "hot-cross bun"
|
||||
desc = "The Cross represents the Assistants that died for your sins."
|
||||
icon_state = "hotcrossbun"
|
||||
icon_state = "hotcrossbun"
|
||||
|
||||
@@ -509,7 +509,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 3)
|
||||
cooked_type = null
|
||||
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/dankpocket
|
||||
name = "\improper Dank-pocket"
|
||||
@@ -556,9 +556,11 @@
|
||||
name = "exceptional plump helmet biscuit"
|
||||
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
foodtype += ANTITOXIC
|
||||
. = ..()
|
||||
if(fey)
|
||||
reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
|
||||
foodtype += ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cracker
|
||||
name = "cracker"
|
||||
|
||||
@@ -171,8 +171,10 @@
|
||||
name = "exceptional plump pie"
|
||||
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!"
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
|
||||
foodtype += ANTITOXIC
|
||||
if(fey)
|
||||
reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
|
||||
foodtype += ANTITOXIC
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pie/xemeatpie
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/omnizine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/donkpocket
|
||||
name = "donkpocket pizza slice"
|
||||
@@ -117,7 +117,7 @@
|
||||
icon_state = "donkpocketpizzaslice"
|
||||
filling_color = "#FFA500"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizza/dank
|
||||
name = "dank pizza"
|
||||
@@ -127,7 +127,7 @@
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
|
||||
foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/dank
|
||||
name = "dank pizza slice"
|
||||
@@ -135,7 +135,7 @@
|
||||
icon_state = "dankpizzaslice"
|
||||
filling_color = "#2E8B57"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
|
||||
foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizza/sassysage
|
||||
name = "sassysage pizza"
|
||||
@@ -187,6 +187,7 @@
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/arnold
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30)
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm
|
||||
var/obj/item/bodypart/l_arm = user.get_bodypart(BODY_ZONE_L_ARM)
|
||||
@@ -244,4 +245,4 @@
|
||||
icon_state = "meatpizzaslice"
|
||||
filling_color = "#A52A2A"
|
||||
tastes = list("cardboard" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/medicine/omnizine = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
|
||||
tastes = list("leaves" = 1)
|
||||
foodtype = VEGETABLES
|
||||
foodtype = VEGETABLES | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/herbsalad
|
||||
name = "herb salad"
|
||||
@@ -38,7 +38,7 @@
|
||||
bonus_reagents = list(/datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
|
||||
tastes = list("leaves" = 1, "potato" = 1, "meat" = 1, "valids" = 1)
|
||||
foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT
|
||||
foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/oatmeal
|
||||
name = "oatmeal"
|
||||
@@ -133,7 +133,7 @@
|
||||
trash = /obj/item/reagent_containers/glass/bowl
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/medicine/earthsblood = 3, /datum/reagent/medicine/omnizine = 5, /datum/reagent/drug/happiness = 2)
|
||||
tastes = list("hope" = 1)
|
||||
foodtype = VEGETABLES
|
||||
foodtype = VEGETABLES | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/gumbo
|
||||
name = "black eyed gumbo"
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
icon_state = "nettlesoup"
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
|
||||
tastes = list("nettles" = 1)
|
||||
foodtype = VEGETABLES
|
||||
foodtype = VEGETABLES | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/mystery
|
||||
name = "mystery soup"
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/doctor_delight = 5)
|
||||
filling_color = "#F5F5DC"
|
||||
tastes = list("sweetness" = 3, "cake" = 1)
|
||||
foodtype = GRAIN | FRUIT | VEGETABLES
|
||||
foodtype = GRAIN | FRUIT | VEGETABLES | ANTITOXIC
|
||||
custom_price = PRICE_CHEAP
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/energybar
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
seed = /obj/item/seeds/ambrosia/deus
|
||||
name = "ambrosia deus branch"
|
||||
desc = "Eating this makes you feel immortal!"
|
||||
foodtype = VEGETABLES | ANTITOXIC
|
||||
icon_state = "ambrosiadeus"
|
||||
filling_color = "#008B8B"
|
||||
wine_power = 50
|
||||
|
||||
@@ -104,6 +104,7 @@
|
||||
seed = /obj/item/seeds/cannabis/death
|
||||
name = "death cannabis leaf"
|
||||
desc = "Looks a bit dark. Oh well."
|
||||
foodtype = VEGETABLES | TOXIC
|
||||
icon_state = "blackcannabis"
|
||||
wine_power = 40
|
||||
|
||||
@@ -111,6 +112,7 @@
|
||||
seed = /obj/item/seeds/cannabis/white
|
||||
name = "white cannabis leaf"
|
||||
desc = "It feels smooth and nice to the touch."
|
||||
foodtype = VEGETABLES | ANTITOXIC
|
||||
icon_state = "whitecannabis"
|
||||
wine_power = 10
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
seed = /obj/item/seeds/lime
|
||||
name = "lime"
|
||||
desc = "It's so sour, your face will twist."
|
||||
foodtype = FRUIT | ANTITOXIC
|
||||
icon_state = "lime"
|
||||
filling_color = "#00FF00"
|
||||
juice_results = list(/datum/reagent/consumable/limejuice = 0)
|
||||
|
||||
@@ -80,6 +80,9 @@
|
||||
if(mind_traits)
|
||||
for(var/t in mind_traits)
|
||||
ADD_TRAIT(H.mind, t, JOB_TRAIT)
|
||||
if(/datum/quirk/paraplegic in blacklisted_quirks)
|
||||
H.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection
|
||||
H.set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs
|
||||
|
||||
/datum/job/proc/announce(mob/living/carbon/human/H)
|
||||
if(head_announce)
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
new /obj/item/gun/magic/wand/book/spark(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/misc/PopulateContents()
|
||||
var/loot = rand(1,11)
|
||||
var/loot = rand(1,14)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/shared_storage/red(src)
|
||||
@@ -120,10 +120,7 @@
|
||||
new /obj/item/bedsheet/cosmos(src)
|
||||
new /obj/item/melee/skateboard/hoverboard(src)
|
||||
if(11)
|
||||
if(prob(50))
|
||||
new /obj/item/malf_upgrade
|
||||
else
|
||||
new /obj/item/disk/tech_disk/illegal
|
||||
new /obj/item/disk/tech_disk/illegal(src)
|
||||
if(12)
|
||||
new /obj/item/clothing/suit/space/hardsuit/cult(src)
|
||||
if(13)
|
||||
@@ -135,7 +132,7 @@
|
||||
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/all/PopulateContents()
|
||||
var/loot = rand(1,31)
|
||||
var/loot = rand(1,29)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/shared_storage/red(src)
|
||||
@@ -162,44 +159,44 @@
|
||||
new /obj/item/bedsheet/cosmos(src)
|
||||
new /obj/item/melee/skateboard/hoverboard(src)
|
||||
if(11)
|
||||
new /obj/item/disk/tech_disk/illegal
|
||||
if(15)
|
||||
new /obj/item/disk/tech_disk/illegal(src)
|
||||
if(12)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src)
|
||||
if(16)
|
||||
if(13)
|
||||
new /obj/item/nullrod/scythe/talking(src)
|
||||
if(17)
|
||||
if(14)
|
||||
new /obj/item/nullrod/armblade(src)
|
||||
if(18)
|
||||
if(15)
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src)
|
||||
if(19)
|
||||
if(16)
|
||||
new /obj/item/grenade/clusterbuster/inferno(src)
|
||||
if(20)
|
||||
if(17)
|
||||
new /obj/item/gun/magic/wand/book/shock(src)
|
||||
if(21)
|
||||
if(18)
|
||||
new /obj/item/gun/magic/wand/book/page(src)
|
||||
if(22)
|
||||
if(19)
|
||||
new /obj/item/gun/magic/wand/book/spark(src)
|
||||
if(23)
|
||||
if(20)
|
||||
new /obj/item/soulstone/anybody(src)
|
||||
if(24)
|
||||
if(21)
|
||||
new /obj/item/rod_of_asclepius(src)
|
||||
if(25)
|
||||
if(22)
|
||||
new /obj/item/organ/heart/cursed/wizard(src)
|
||||
if(26)
|
||||
if(23)
|
||||
new /obj/item/book/granter/spell/summonitem(src)
|
||||
if(27)
|
||||
if(24)
|
||||
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
||||
new /obj/item/bedsheet/cult(src)
|
||||
if(28)
|
||||
if(25)
|
||||
new /obj/item/clothing/neck/necklace/memento_mori(src)
|
||||
if(28)
|
||||
if(26)
|
||||
new /obj/item/warp_cube/red(src)
|
||||
if(29)
|
||||
if(27)
|
||||
new /obj/item/immortality_talisman(src)
|
||||
if(30)
|
||||
if(28)
|
||||
new /obj/item/gun/magic/wand/book/healing(src)
|
||||
if(31)
|
||||
if(29)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
|
||||
|
||||
@@ -414,6 +414,8 @@
|
||||
give_magic(humanc)
|
||||
if(GLOB.curse_of_madness_triggered)
|
||||
give_madness(humanc, GLOB.curse_of_madness_triggered)
|
||||
if(humanc.client)
|
||||
humanc.client.prefs.post_copy_to(humanc)
|
||||
|
||||
GLOB.joined_player_list += character.ckey
|
||||
GLOB.latejoiners += character
|
||||
@@ -567,7 +569,7 @@
|
||||
|
||||
client.prefs.scars_list["[cur_scar_index]"] = valid_scars
|
||||
client.prefs.save_character()
|
||||
client.prefs.copy_to(H)
|
||||
client.prefs.copy_to(H, initial_spawn = TRUE)
|
||||
H.dna.update_dna_identity()
|
||||
if(mind)
|
||||
if(transfer_after)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
|
||||
// Apply the Dummy's preview background first so we properly layer everything else on top of it.
|
||||
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
|
||||
copy_to(mannequin)
|
||||
copy_to(mannequin, initial_spawn = TRUE)
|
||||
|
||||
if(previewJob && equip_job)
|
||||
mannequin.job = previewJob.title
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
if(move_delay_add > 0)
|
||||
move_delay_add = max(0, move_delay_add - rand(1, 2))
|
||||
|
||||
/mob/living/carbon/alien/handle_changeling()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/handle_fire()//Aliens on fire code
|
||||
if(..())
|
||||
return
|
||||
|
||||
@@ -18,6 +18,9 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
|
||||
/mob/living/carbon/human/dummy/Life()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/dummy/update_mobility()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/dummy/proc/wipe_state()
|
||||
delete_equipment()
|
||||
icon_render_key = null
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
var/datum/action/innate/regenerate_limbs/regenerate_limbs
|
||||
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
|
||||
liked_food = TOXIC | MEAT
|
||||
toxic_food = null
|
||||
disliked_food = null
|
||||
toxic_food = ANTITOXIC
|
||||
coldmod = 6 // = 3x cold damage
|
||||
heatmod = 0.5 // = 1/4x heat damage
|
||||
burnmod = 0.5 // = 1/2x generic burn damage
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
/mob/living/carbon/BiologicalLife(seconds, times_fired)
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
//Handles the unique mentabolism of bloodsuckers, look at /datum/antagonist/bloodsucker/proc/LifeTick()
|
||||
handle_bloodsucker()
|
||||
//Reagent processing needs to come before breathing, to prevent edge cases.
|
||||
handle_organs()
|
||||
. = ..() // if . is false, we are dead.
|
||||
@@ -410,25 +406,7 @@
|
||||
for(var/thing in all_wounds)
|
||||
var/datum/wound/W = thing
|
||||
if(W.processes) // meh
|
||||
W.handle_process()
|
||||
|
||||
//todo generalize this and move hud out
|
||||
/mob/living/carbon/proc/handle_changeling()
|
||||
if(mind && hud_used && hud_used.lingchemdisplay)
|
||||
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(changeling)
|
||||
changeling.regenerate()
|
||||
hud_used.lingchemdisplay.invisibility = 0
|
||||
hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#dd66dd'>[round(changeling.chem_charges)]</font></div>"
|
||||
else
|
||||
hud_used.lingchemdisplay.invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
|
||||
/mob/living/carbon/proc/handle_bloodsucker()
|
||||
if(mind && AmBloodsucker(src))
|
||||
var/datum/antagonist/bloodsucker/B = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
B.LifeTick()
|
||||
|
||||
W.handle_process()
|
||||
|
||||
/mob/living/carbon/handle_mutations_and_radiation()
|
||||
if(dna && dna.temporary_mutations.len)
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
* Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop.
|
||||
*/
|
||||
/mob/living/proc/BiologicalLife(seconds, times_fired)
|
||||
SEND_SIGNAL(src,COMSIG_LIVING_BIOLOGICAL_LIFE, seconds, times_fired)
|
||||
handle_diseases()// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not.
|
||||
|
||||
handle_wounds()
|
||||
@@ -78,6 +79,7 @@
|
||||
* Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop.
|
||||
*/
|
||||
/mob/living/proc/PhysicalLife(seconds, times_fired)
|
||||
SEND_SIGNAL(src,COMSIG_LIVING_PHYSICAL_LIFE, seconds, times_fired)
|
||||
if(digitalinvis)
|
||||
handle_diginvis() //AI becomes unable to see mob
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
for (var/x in 1 to PILL_STYLE_COUNT)
|
||||
var/list/SL = list()
|
||||
SL["id"] = x
|
||||
SL["htmltag"] = assets.icon_tag("pill[x]")
|
||||
SL["class_name"] = assets.icon_class_name("pill[x]")
|
||||
pill_styles += list(SL)
|
||||
|
||||
|
||||
|
||||
@@ -2280,6 +2280,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
quality = RACE_DRINK
|
||||
else
|
||||
C.adjust_disgust(disgust)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/coldscales
|
||||
name = "Coldscales"
|
||||
@@ -2289,7 +2290,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "coldscales"
|
||||
glass_name = "glass of Coldscales"
|
||||
glass_desc = "A soft green drink that looks inviting!"
|
||||
|
||||
species_required = "lizard"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/oil_drum
|
||||
@@ -2301,7 +2301,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "oil_drum"
|
||||
glass_name = "Drum of oil"
|
||||
glass_desc = "A gray can of booze and oil..."
|
||||
|
||||
species_required = "robot"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/nord_king
|
||||
@@ -2312,7 +2311,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "nord_king"
|
||||
glass_name = "Keg of Nord King"
|
||||
glass_desc = "A dripping keg of red mead."
|
||||
|
||||
species_required = "basic"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/velvet_kiss
|
||||
@@ -2324,7 +2322,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "velvet_kiss"
|
||||
glass_name = "glass of Velvet Kiss"
|
||||
glass_desc = "Red and white drink for the upper classes or undead."
|
||||
|
||||
species_required = "undead"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/abduction_fruit
|
||||
@@ -2336,7 +2333,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "abduction_fruit"
|
||||
glass_name = "glass of Abduction Fruit"
|
||||
glass_desc = "Mixed fruits that were never meant to be mixed..."
|
||||
|
||||
species_required = "alien"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/bug_zapper
|
||||
@@ -2348,7 +2344,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "bug_zapper"
|
||||
glass_name = "glass of Bug Zapper"
|
||||
glass_desc = "An odd mix of copper, lemon juice and power meant for non-human consumption."
|
||||
|
||||
species_required = "bug"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/mush_crush
|
||||
@@ -2360,7 +2355,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "mush_crush"
|
||||
glass_name = "glass of Mush Crush"
|
||||
glass_desc = "Popular among people that want to grow their own food rather than drink the soil."
|
||||
|
||||
species_required = "plant"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/darkbrew
|
||||
@@ -2372,7 +2366,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "darkbrew"
|
||||
glass_name = "glass of Darkbrew"
|
||||
glass_desc = "A pitch black drink that's commonly confused with a type of coffee."
|
||||
|
||||
species_required = "shadow"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/hollow_bone
|
||||
@@ -2384,7 +2377,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "hollow_bone"
|
||||
glass_name = "skull of Hollow Bone"
|
||||
glass_desc = "Mixing of milk and bone hurting juice for the enjoyment of rather skinny people."
|
||||
|
||||
species_required = "skeleton"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/frisky_kitty
|
||||
@@ -2396,7 +2388,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "frisky_kitty"
|
||||
glass_name = "cup of Drisky Kitty"
|
||||
glass_desc = "Warm milk and some catnip."
|
||||
|
||||
species_required = "furry"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/jell_wyrm
|
||||
@@ -2408,7 +2399,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "jell_wyrm"
|
||||
glass_name = "glass of Jell Wyrm"
|
||||
glass_desc = "A bubbly drink that is rather inviting to those that don't know who it's meant for."
|
||||
|
||||
species_required = "jelly"
|
||||
|
||||
/datum/reagent/consumable/ethanol/species_drink/laval_spit //Yes Laval
|
||||
@@ -2420,7 +2410,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "laval_spit"
|
||||
glass_name = "glass of Laval Spit"
|
||||
glass_desc = "Piping hot drink for those who can stomach the heat of lava."
|
||||
|
||||
species_required = "golem"
|
||||
|
||||
///////////////
|
||||
|
||||
@@ -79,10 +79,9 @@
|
||||
/obj/item/ingot/bronze
|
||||
custom_materials = list(/datum/material/bronze=12000)
|
||||
|
||||
/obj/item/ingot/bronze/ratvar
|
||||
material_flags = MATERIAL_COLOR
|
||||
name = "brass ingnot"
|
||||
desc = "On closer inspection, what appears to be wholly-unsuitable-for-smithing brass is actually more structurally stable bronze. Ratvar must have transformed the brass into bronze. Somehow."
|
||||
/obj/item/ingot/ratvar
|
||||
custom_materials = list(/datum/material/brass=12000)
|
||||
desc = "On closer inspection, what appears to be wholly-unsuitable-for-smithing brass is actually primarily replicant alloy. Nezbere must have switched it while you weren't looking."
|
||||
|
||||
|
||||
/obj/item/smithing/attackby(obj/item/I, mob/user)
|
||||
@@ -382,7 +381,7 @@
|
||||
finalitem = /obj/item/melee/smith/twohand/glaive
|
||||
icon_state = "glaive"
|
||||
|
||||
/obj/item/smithing/glaive/startfinish()
|
||||
/obj/item/smithing/glaivehead/startfinish()
|
||||
var/obj/item/melee/smith/twohand/glaive/finalforreal = new /obj/item/melee/smith/twohand/glaive(src)
|
||||
finalforreal.force += quality
|
||||
finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
/datum/unit_test/reactions/Run()
|
||||
for(var/datum/gas_reaction/G in SSair.gas_reactions)
|
||||
var/test_info = G.test()
|
||||
if(!test_info["success"])
|
||||
var/message = test_info["message"]
|
||||
Fail("Gas reaction [G.name] is failing its unit test with the following message: [message]")
|
||||
@@ -20,6 +20,7 @@
|
||||
desc = "A sleek box containing a brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers, and an extra speedloader."
|
||||
item = /obj/item/storage/box/syndie_kit/revolver
|
||||
cost = 13
|
||||
player_minimum = 15
|
||||
surplus = 50
|
||||
exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
|
||||
|
||||
|
||||
@@ -50,6 +50,100 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">17 September 2020</h2>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Failing the plushmium reaction can now create peculiar plushies, depending on reaction volume.</li>
|
||||
<li class="bugfix">The mood-buff from petting a plushie now works properly again.</li>
|
||||
<li class="bugfix">Fixed wacky necropolis loot chest behavior</li>
|
||||
</ul>
|
||||
<h3 class="author">EmeraldSundisk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds the Research Director's office to Omega Station</li>
|
||||
<li class="rscadd">Adds 2 new solar arrays (and control rooms)</li>
|
||||
<li class="rscadd">Adds some action figures that weren't there previously</li>
|
||||
<li class="rscadd">The CMO's office now has a light switch</li>
|
||||
<li class="tweak">Slight readjustments to impacted areas</li>
|
||||
<li class="tweak">Readjusts the toxins air supply line to (ideally) be easier to service</li>
|
||||
<li class="bugfix">Department camera consoles should now be able to actually check appropriate cameras</li>
|
||||
<li class="bugfix">Xenobiology can now be locked down (by the Research Director)</li>
|
||||
</ul>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a brain damage line</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Your balls finally feel full, again.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">due to changes in policy, and several lawsuits, Nanotrasen has been forced to allow disabled people to sign up</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">16 September 2020</h2>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">fixed an icon path</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">12 September 2020</h2>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The Polychromic winter coat's hoodie will now polychrome, alongside any other new polychromic items with toggleable headwear.</li>
|
||||
<li class="bugfix">Minesweeper will no longer blow up the player's ears when they select "Play on the same board"</li>
|
||||
<li class="rscadd">Slimepeople will find warm donk pockets among other toxin healing items even more repulsive, as they are anti-toxic.</li>
|
||||
<li class="tweak">Slimepeople are now neutral to gross foods.</li>
|
||||
</ul>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">AIs can no longer qdel() the gravity generator</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">Added some unit tests for reactions.</li>
|
||||
<li class="refactor">replaced handle_changeling and handle_bloodsucker with signal registration</li>
|
||||
</ul>
|
||||
<h3 class="author">Sonic121x updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed pill button on chemical press</li>
|
||||
</ul>
|
||||
<h3 class="author">TheObserver-sys updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Brass now has a proper datum. Aspiring Forgetenders rejoice!</li>
|
||||
</ul>
|
||||
<h3 class="author">Trilbyspaceclone updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Race based drinks will no longer stay inside your blood for ever.</li>
|
||||
</ul>
|
||||
<h3 class="author">Tupinambis updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Redid Cogstation atmos pipes to make it less cluttered.</li>
|
||||
<li class="tweak">Removed a few doors from the main hallway to mitigate chokepoint issues</li>
|
||||
<li class="bugfix">All belt hell conveyers are now on by default, so that belt hell actually works.</li>
|
||||
<li class="bugfix">IDs for poddoors and belts and the like. Everything is now properly hooked and should work as expected (except for the pressure triggered mass drivers)</li>
|
||||
<li class="bugfix">addresses most if not all roundstart active turfs.</li>
|
||||
<li class="bugfix">Issue where wires were connected to the SMES improperly, and SMES were not properly precharged, resulting in power failure earlier than intended.</li>
|
||||
<li class="bugfix">various rogue turfs and wirings.</li>
|
||||
<li class="bugfix">security office APC being hooked to maintenance for some reason.</li>
|
||||
<li class="bugfix">TEG is now directly wired to the SMES.</li>
|
||||
<li class="code_imp">adds a subtype of mass drivers that is triggered by things being on it. TODO: Make these mass drivers trigger poddoors, to make belt hell fully functional.</li>
|
||||
</ul>
|
||||
<h3 class="author">lolman360 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">glaives now work again</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Revolver is now poplocked down to fifteen people.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">11 September 2020</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Superconducting turfs now can't go below 0 celsius.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">09 September 2020</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -1313,135 +1407,6 @@
|
||||
<li class="bugfix">fixes a small pickle related issue</li>
|
||||
<li class="rscadd">recent culinary and scientific advancements have brought forth new pickle related technologies</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">16 July 2020</h2>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes a zeolite runtime caused by a missing check.</li>
|
||||
</ul>
|
||||
<h3 class="author">Sneakyrat6 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes being able to meta people real name with OOC Notes</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">travelling traders from another dimension can now visit the station in search of something specific, and reward you for giving it to them</li>
|
||||
<li class="bugfix">small error with pet carrier logic fixed and also making sure simple mobs are catered for properly inside bluespace jars</li>
|
||||
<li class="bugfix">fixes coin related issue</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">15 July 2020</h2>
|
||||
<h3 class="author">Sonic121x updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Paramedic jumpsuit</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">14 July 2020</h2>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">chemical reactions now are sorted by priority first and temperature second.</li>
|
||||
<li class="rscadd">sec and medical records have been added to character setup.</li>
|
||||
<li class="bugfix">circuit reagent heaters are now sanitized for temperature from 2.7 to 1000.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">ports a money bag exploit</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">13 July 2020</h2>
|
||||
<h3 class="author">Linzolle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">you can no longer vore and digest people regardless of vore preferences</li>
|
||||
</ul>
|
||||
<h3 class="author">Owai-Seek updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Trashbags can now hold most shoes, and organs.</li>
|
||||
<li class="balance">You can no longer nest nuke disks or hold brains in the trash.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">12 July 2020</h2>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Sentinels compromise now heals augmented bodyparts.</li>
|
||||
</ul>
|
||||
<h3 class="author">EmeraldSundisk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds turnstiles to CogStation's security wing</li>
|
||||
<li class="rscadd">Readds robotics to the Corpse Disposal Network</li>
|
||||
<li class="rscadd">Readds chemistry's ability to send items directly to the experimentation lab</li>
|
||||
<li class="tweak">Visual renovation and slight adjustments to CogStation's robotics lab</li>
|
||||
<li class="tweak">Slight visual adjustments elsewhere (the library)</li>
|
||||
<li class="bugfix">CogStation's mail and disposal pipes are once again complete</li>
|
||||
<li class="bugfix">CogStation's robotics lab now has spawners, lights, and other room essentials</li>
|
||||
</ul>
|
||||
<h3 class="author">HeroWithYay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added Telecrystal Dust</li>
|
||||
<li class="tweak">Telecrystals can be sold at cargo</li>
|
||||
</ul>
|
||||
<h3 class="author">LetterN updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added d[thing] emojis</li>
|
||||
<li class="bugfix">bye xss</li>
|
||||
</ul>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">Removes northern tunnel to the monastery on Pubby</li>
|
||||
</ul>
|
||||
<h3 class="author">Yakumo Chen updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a wedding crate to cargo full of wedding attire.</li>
|
||||
</ul>
|
||||
<h3 class="author">kappa-sama updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">wisdom cow is half as common and is wise enough to lag the server 66% less</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="config">policy configuration added, plus support hooks for assisting enforcement of clone memory disorder. logging: added logging of revival by defib, cloning, strangereagent, and revival surgery</li>
|
||||
<li class="rscadd">You can now "audibly emote" by having ! at the start of a sentence.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">due to recent biological advancements, you can now make eye contact with people.</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">a singular stray pixel</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">11 July 2020</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="refactor">Gas mixtures now live entirely in a DLL.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">10 July 2020</h2>
|
||||
<h3 class="author">Chiirno updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">Gave jellypeople a unique brain object /obj/item/organ/brain/jelly</li>
|
||||
<li class="imageadd">added an icon for jellypeople brains.</li>
|
||||
</ul>
|
||||
<h3 class="author">EmeraldSundisk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a pool to PubbyStation</li>
|
||||
<li class="tweak">Slight adjustments to the surrounding area as to fit said pool</li>
|
||||
</ul>
|
||||
<h3 class="author">Sneakyrat6 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes hair falling out of hoodies.</li>
|
||||
</ul>
|
||||
<h3 class="author">TheObserver-sys updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Actually adds the juice reagent to make laugh peas donuts.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">09 July 2020</h2>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">bluespace tray added, allowing twice as many items as the regular tray, printable at the service lathe, researched through science</li>
|
||||
<li class="rscadd">bluespace jar added, a kind of pet carrier that allows human sized mobs inside, and smashes when thrown, researched and printed through science</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<b>GoonStation 13 Development Team</b>
|
||||
|
||||
@@ -27275,3 +27275,72 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
- bugfix: Made superconductivity work for the first time literally ever.
|
||||
timothyteakettle:
|
||||
- bugfix: accents work better
|
||||
2020-09-11:
|
||||
Putnam3145:
|
||||
- balance: Superconducting turfs now can't go below 0 celsius.
|
||||
2020-09-12:
|
||||
BlueWildrose:
|
||||
- bugfix: The Polychromic winter coat's hoodie will now polychrome, alongside any
|
||||
other new polychromic items with toggleable headwear.
|
||||
- bugfix: Minesweeper will no longer blow up the player's ears when they select
|
||||
"Play on the same board"
|
||||
- rscadd: Slimepeople will find warm donk pockets among other toxin healing items
|
||||
even more repulsive, as they are anti-toxic.
|
||||
- tweak: Slimepeople are now neutral to gross foods.
|
||||
DeltaFire15:
|
||||
- balance: AIs can no longer qdel() the gravity generator
|
||||
Putnam3145:
|
||||
- code_imp: Added some unit tests for reactions.
|
||||
- refactor: replaced handle_changeling and handle_bloodsucker with signal registration
|
||||
Sonic121x:
|
||||
- bugfix: Fixed pill button on chemical press
|
||||
TheObserver-sys:
|
||||
- rscadd: Brass now has a proper datum. Aspiring Forgetenders rejoice!
|
||||
Trilbyspaceclone:
|
||||
- bugfix: Race based drinks will no longer stay inside your blood for ever.
|
||||
Tupinambis:
|
||||
- tweak: Redid Cogstation atmos pipes to make it less cluttered.
|
||||
- tweak: Removed a few doors from the main hallway to mitigate chokepoint issues
|
||||
- bugfix: All belt hell conveyers are now on by default, so that belt hell actually
|
||||
works.
|
||||
- bugfix: IDs for poddoors and belts and the like. Everything is now properly hooked
|
||||
and should work as expected (except for the pressure triggered mass drivers)
|
||||
- bugfix: addresses most if not all roundstart active turfs.
|
||||
- bugfix: Issue where wires were connected to the SMES improperly, and SMES were
|
||||
not properly precharged, resulting in power failure earlier than intended.
|
||||
- bugfix: various rogue turfs and wirings.
|
||||
- bugfix: security office APC being hooked to maintenance for some reason.
|
||||
- bugfix: TEG is now directly wired to the SMES.
|
||||
- code_imp: 'adds a subtype of mass drivers that is triggered by things being on
|
||||
it. TODO: Make these mass drivers trigger poddoors, to make belt hell fully
|
||||
functional.'
|
||||
lolman360:
|
||||
- bugfix: glaives now work again
|
||||
zeroisthebiggay:
|
||||
- balance: Revolver is now poplocked down to fifteen people.
|
||||
2020-09-16:
|
||||
timothyteakettle:
|
||||
- tweak: fixed an icon path
|
||||
2020-09-17:
|
||||
DeltaFire15:
|
||||
- rscadd: Failing the plushmium reaction can now create peculiar plushies, depending
|
||||
on reaction volume.
|
||||
- bugfix: The mood-buff from petting a plushie now works properly again.
|
||||
- bugfix: Fixed wacky necropolis loot chest behavior
|
||||
EmeraldSundisk:
|
||||
- rscadd: Adds the Research Director's office to Omega Station
|
||||
- rscadd: Adds 2 new solar arrays (and control rooms)
|
||||
- rscadd: Adds some action figures that weren't there previously
|
||||
- rscadd: The CMO's office now has a light switch
|
||||
- tweak: Slight readjustments to impacted areas
|
||||
- tweak: Readjusts the toxins air supply line to (ideally) be easier to service
|
||||
- bugfix: Department camera consoles should now be able to actually check appropriate
|
||||
cameras
|
||||
- bugfix: Xenobiology can now be locked down (by the Research Director)
|
||||
MrJWhit:
|
||||
- rscadd: Adds a brain damage line
|
||||
Putnam3145:
|
||||
- bugfix: Your balls finally feel full, again.
|
||||
timothyteakettle:
|
||||
- rscadd: due to changes in policy, and several lawsuits, Nanotrasen has been forced
|
||||
to allow disabled people to sign up
|
||||
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 45 KiB |
@@ -510,3 +510,9 @@
|
||||
slot = SLOT_IN_BACKPACK
|
||||
path = /obj/item/bedsheet/cosmos
|
||||
ckeywhitelist = list("grunnyyy")
|
||||
|
||||
/datum/gear/donator/hisakaki
|
||||
name = "halo"
|
||||
slot = SLOT_HEAD
|
||||
path = /obj/item/clothing/head/halo
|
||||
ckeywhitelist = list("hisakaki")
|
||||
|
||||
@@ -550,3 +550,12 @@
|
||||
desc = "A fancy cloak embroidered with polychromatic thread in a pattern that reminds one of the wielders of unlimited power."
|
||||
icon_state = "polyce"
|
||||
poly_colors = list("#808080", "#8CC6FF", "#FF3535")
|
||||
|
||||
/obj/item/clothing/head/halo
|
||||
name = "transdimensional halo"
|
||||
desc = "An oddly shaped halo that magically hovers above the head."
|
||||
icon_state = "halo"
|
||||
item_state = "halo"
|
||||
icon = 'icons/mob/clothing/custom_w.dmi'
|
||||
mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi'
|
||||
mutantrace_variation = NONE
|
||||
@@ -501,7 +501,10 @@
|
||||
PurityMin = 0.6
|
||||
|
||||
/datum/chemical_reaction/fermi/plushmium/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
|
||||
new /obj/item/toy/plush/random(get_turf(my_atom))
|
||||
if(volume < 20) //It creates a normal plush at low volume.. at higher amounts, things get slightly more interesting.
|
||||
new /obj/item/toy/plush/random(get_turf(my_atom))
|
||||
else
|
||||
new /obj/item/toy/plush/plushling(get_turf(my_atom))
|
||||
my_atom.visible_message("<span class='warning'>The reaction suddenly zaps, creating a plushie!</b></span>")
|
||||
my_atom.reagents.clear_reagents()
|
||||
|
||||
|
||||
@@ -132,7 +132,8 @@
|
||||
"@pick(semicolon)My balls finally feel full, again.",
|
||||
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
|
||||
";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
|
||||
"@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!"
|
||||
"@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!",
|
||||
"@pick(semicolon) FUC'KING MuNKEY WAch TALKN SHIT"
|
||||
],
|
||||
|
||||
"mutations": [
|
||||
|
||||