Merge branch 'master' into Dispencer-UI-change
This commit is contained in:
@@ -40,17 +40,18 @@
|
||||
var/rounded_length = round(length)
|
||||
var/new_size
|
||||
var/enlargement = FALSE
|
||||
var/max_D = CONFIG_GET(number/penis_max_inches_prefs)
|
||||
switch(rounded_length)
|
||||
if(0 to 6) //If modest size
|
||||
new_size = 1
|
||||
if(7 to 11) //If large
|
||||
new_size = 2
|
||||
if(12 to 20) //If massive
|
||||
if(12 to max_D) //If massive
|
||||
new_size = 3
|
||||
if(21 to 34) //If massive and due for large effects
|
||||
if(max_D + 1 to max_D+13) //If massive and due for large effects, modified in case some server owner running recent citcode decides to be insane with dick sizes in the config
|
||||
new_size = 3
|
||||
enlargement = TRUE
|
||||
if(35 to INFINITY) //If comical
|
||||
if(max_D+14 to INFINITY) //If comical
|
||||
new_size = 4 //no new sprites for anything larger yet
|
||||
enlargement = TRUE
|
||||
if(owner)
|
||||
|
||||
@@ -90,6 +90,18 @@
|
||||
crate_name = "medical hardsuit"
|
||||
crate_type = /obj/structure/closet/crate/secure/medical
|
||||
|
||||
/datum/supply_pack/medical/paramedicevasuit
|
||||
name = "Paramedic EVA Suit"
|
||||
desc = "Greytide pushing up daisies with the carp outside the station? Chemistry vented in a meth experiment gone wrong? Be the blue saviour this station desperately needs and get your Paramedical EVA suit today! Requires medical access to open."
|
||||
cost = 1975
|
||||
access = ACCESS_MEDICAL
|
||||
contains = list(/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/clothing/head/helmet/space/eva/paramedic,
|
||||
/obj/item/clothing/suit/space/eva/paramedic,
|
||||
/obj/item/clothing/mask/breath)
|
||||
crate_name = "paramedic EVA suit"
|
||||
crate_type = /obj/structure/closet/crate/secure/medical
|
||||
|
||||
/datum/supply_pack/medical/supplies
|
||||
name = "Medical Supplies Crate"
|
||||
desc = "Contains seven beakers, syringes, and bodybags. Three morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze, as well as a bottle of stimulant pills for long, hard work days. German doctor not included."
|
||||
|
||||
@@ -1024,3 +1024,25 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
verb_tabs |= verb_to_init.category
|
||||
verblist[++verblist.len] = list(verb_to_init.category, verb_to_init.name)
|
||||
src << output("[url_encode(json_encode(verb_tabs))];[url_encode(json_encode(verblist))]", "statbrowser:init_verbs")
|
||||
|
||||
//increment progress for an unlockable loadout item
|
||||
/client/proc/increment_progress(key, amount)
|
||||
if(prefs)
|
||||
var/savefile/S = new /savefile(prefs.path)
|
||||
var/list/unlockable_loadout_data = prefs.unlockable_loadout_data
|
||||
if(!length(unlockable_loadout_data))
|
||||
unlockable_loadout_data = list()
|
||||
unlockable_loadout_data[key] = amount
|
||||
WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data))
|
||||
prefs.unlockable_loadout_data = unlockable_loadout_data
|
||||
return TRUE
|
||||
else
|
||||
if(unlockable_loadout_data[key])
|
||||
unlockable_loadout_data[key] += amount
|
||||
else
|
||||
unlockable_loadout_data[key] = amount
|
||||
WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data))
|
||||
prefs.unlockable_loadout_data = unlockable_loadout_data
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -198,6 +198,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/gear_points = 10
|
||||
var/list/gear_categories
|
||||
var/list/loadout_data = list()
|
||||
var/list/unlockable_loadout_data = list()
|
||||
var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES
|
||||
var/gear_category
|
||||
var/gear_subcategory
|
||||
@@ -907,12 +908,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1]
|
||||
extra_color_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_color=1;loadout_gear_name=[html_encode(gear.name)];'>Color</a>"
|
||||
extra_color_data += "<span style='border: 1px solid #161616; background-color: [loadout_color_non_poly];'> </span>"
|
||||
else if(gear_points <= 0)
|
||||
else if((gear_points - gear.cost) < 0)
|
||||
class_link = "style='white-space:normal;' class='linkOff'"
|
||||
else if(donoritem)
|
||||
class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
|
||||
else
|
||||
else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear))
|
||||
class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
|
||||
else
|
||||
class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'"
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><a [class_link]>[name]</a>[extra_color_data]</td>"
|
||||
dat += "<td width = 5% style='vertical-align:top'>[gear.cost]</td><td>"
|
||||
if(islist(gear.restricted_roles))
|
||||
@@ -925,7 +928,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
if(!istype(gear, /datum/gear/unlockable))
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
else
|
||||
//we add the user's progress to the description assuming they have progress
|
||||
var/datum/gear/unlockable/unlockable = gear
|
||||
var/progress_made = unlockable_loadout_data[unlockable.progress_key]
|
||||
if(!progress_made)
|
||||
progress_made = 0
|
||||
dat += "</td><td><font size=2><i>[gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]</i></font></td></tr>"
|
||||
|
||||
dat += "</table>"
|
||||
if(4) // Content preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
@@ -2675,6 +2687,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(G.donoritem && !G.donator_ckey_check(user.ckey))
|
||||
to_chat(user, "<span class='danger'>This is an item intended for donator use only. You are not authorized to use this item.</span>")
|
||||
return
|
||||
if(istype(G, /datum/gear/unlockable) && !can_use_unlockable(G))
|
||||
to_chat(user, "<span class='danger'>To use this item, you need to meet the defined requirements!</span>")
|
||||
return
|
||||
if(gear_points >= initial(G.cost))
|
||||
var/list/new_loadout_data = list(LOADOUT_ITEM = "[G.type]")
|
||||
if(length(G.loadout_initial_colors))
|
||||
@@ -2960,6 +2975,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(find_gear)
|
||||
loadout_data["SAVE_[save_slot]"] -= list(find_gear)
|
||||
|
||||
/datum/preferences/proc/can_use_unlockable(datum/gear/unlockable/unlockable_gear)
|
||||
if(unlockable_loadout_data[unlockable_gear.progress_key] >= unlockable_gear.progress_required)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
#undef DEFAULT_SLOT_AMT
|
||||
#undef HANDS_SLOT_AMT
|
||||
#undef BACKPACK_SLOT_AMT
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 47
|
||||
#define SAVEFILE_VERSION_MAX 48
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -285,6 +285,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
S["loadout"] = safe_json_encode(loadout_data)
|
||||
|
||||
if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake
|
||||
S["unlockable_loadout"] = list()
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
return
|
||||
@@ -427,6 +430,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped
|
||||
|
||||
if(S["unlockable_loadout"])
|
||||
unlockable_loadout_data = safe_json_decode(S["unlockable_loadout"])
|
||||
else
|
||||
unlockable_loadout_data = list()
|
||||
|
||||
if(needs_update >= 0) //save the updated version
|
||||
var/old_default_slot = default_slot
|
||||
var/old_max_save_slots = max_save_slots
|
||||
@@ -532,6 +540,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["auto_ooc"], auto_ooc)
|
||||
WRITE_FILE(S["no_tetris_storage"], no_tetris_storage)
|
||||
|
||||
if(length(unlockable_loadout_data))
|
||||
WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data))
|
||||
else
|
||||
WRITE_FILE(S["unlockable_loadout"], safe_json_encode(list()))
|
||||
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/load_character(slot, bypass_cooldown = FALSE)
|
||||
@@ -736,7 +749,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
belly_prefs = json_from_file["belly_prefs"]
|
||||
|
||||
//gear loadout
|
||||
loadout_data = safe_json_decode(S["loadout"])
|
||||
if(S["loadout"])
|
||||
loadout_data = safe_json_decode(S["loadout"])
|
||||
else
|
||||
loadout_data = list()
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
//preference updating will handle saving the updated data for us.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/clothing/under/rank/civilian/util
|
||||
name = "generic utility uniform"
|
||||
name = "utility uniform"
|
||||
desc = "A utility uniform worn by various crew."
|
||||
icon_state = "utilgen"
|
||||
item_state = "utilgen"
|
||||
|
||||
@@ -3,11 +3,12 @@
|
||||
name = "captain's jumpsuit"
|
||||
icon_state = "captain"
|
||||
item_state = "b_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/captain/util
|
||||
name = "Command Utiltiy Uniform"
|
||||
name = "command utility uniform"
|
||||
desc = "A utility uniform for command personnel."
|
||||
icon_state = "utilcom"
|
||||
item_state = "utilcom"
|
||||
@@ -26,7 +27,6 @@
|
||||
/obj/item/clothing/under/rank/captain/suit
|
||||
name = "captain's suit"
|
||||
desc = "A green suit and yellow necktie. Exemplifies authority."
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15)
|
||||
icon_state = "green_suit"
|
||||
item_state = "dg_suit"
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/doctor/util
|
||||
name = "Medical Utility Uniform"
|
||||
name = "medical utility uniform"
|
||||
desc = "Utility jumpsuit for medical personnel"
|
||||
icon_state = "utilmed"
|
||||
item_state = "utilmed"
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/rnd/scientist/util
|
||||
name = "Science Utility Uniform"
|
||||
name = "science utility uniform"
|
||||
desc = "A utility uniform for science personnel"
|
||||
icon_state = "utilsci"
|
||||
item_state = "utilsci"
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
/obj/machinery/microwave/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
cook()
|
||||
cook(user)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/microwave/ui_interact(mob/user)
|
||||
@@ -226,7 +226,7 @@
|
||||
if("eject")
|
||||
eject()
|
||||
if("use")
|
||||
cook()
|
||||
cook(user)
|
||||
if("examine")
|
||||
examine(user)
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
AM.forceMove(drop_location())
|
||||
ingredients.Cut()
|
||||
|
||||
/obj/machinery/microwave/proc/cook()
|
||||
/obj/machinery/microwave/proc/cook(mob/user)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(operating || broken > 0 || panel_open || !anchored || dirty == 100)
|
||||
@@ -257,7 +257,7 @@
|
||||
start_can_fail()
|
||||
return
|
||||
break
|
||||
start()
|
||||
start(user)
|
||||
|
||||
/obj/machinery/microwave/proc/turn_on()
|
||||
visible_message("\The [src] turns on.", "<span class='italics'>You hear a microwave humming.</span>")
|
||||
@@ -277,9 +277,9 @@
|
||||
#define MICROWAVE_MUCK 1
|
||||
#define MICROWAVE_PRE 2
|
||||
|
||||
/obj/machinery/microwave/proc/start()
|
||||
/obj/machinery/microwave/proc/start(mob/user)
|
||||
turn_on()
|
||||
loop(MICROWAVE_NORMAL, 10)
|
||||
loop(MICROWAVE_NORMAL, 10, user = user)
|
||||
|
||||
/obj/machinery/microwave/proc/start_can_fail()
|
||||
turn_on()
|
||||
@@ -292,7 +292,7 @@
|
||||
update_icon()
|
||||
loop(MICROWAVE_MUCK, 4)
|
||||
|
||||
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * productivity, 2)) // standard wait is 10
|
||||
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * productivity, 2), mob/user) // standard wait is 10
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(type == MICROWAVE_PRE)
|
||||
pre_fail()
|
||||
@@ -300,7 +300,7 @@
|
||||
if(!time)
|
||||
switch(type)
|
||||
if(MICROWAVE_NORMAL)
|
||||
loop_finish()
|
||||
loop_finish(user)
|
||||
if(MICROWAVE_MUCK)
|
||||
muck_finish()
|
||||
if(MICROWAVE_PRE)
|
||||
@@ -308,16 +308,21 @@
|
||||
return
|
||||
time--
|
||||
use_power(500)
|
||||
addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait)
|
||||
addtimer(CALLBACK(src, .proc/loop, type, time, wait, user), wait)
|
||||
|
||||
/obj/machinery/microwave/proc/loop_finish()
|
||||
/obj/machinery/microwave/proc/loop_finish(mob/user)
|
||||
operating = FALSE
|
||||
|
||||
var/metal = 0
|
||||
var/cooked_food = 0
|
||||
for(var/obj/item/O in ingredients)
|
||||
O.microwave_act(src)
|
||||
var/cooked_result = O.microwave_act(src)
|
||||
if(!istype(cooked_result, /obj/item/reagent_containers/food/snacks/badrecipe))
|
||||
cooked_food += 1
|
||||
if(O.custom_materials?.len)
|
||||
metal += O.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
|
||||
if(cooked_food && user.client)
|
||||
user.client.increment_progress("cook", cooked_food)
|
||||
|
||||
if(metal)
|
||||
spark()
|
||||
@@ -336,8 +341,8 @@
|
||||
spark()
|
||||
after_finish_loop()
|
||||
|
||||
/obj/machinery/microwave/proc/pre_success()
|
||||
loop(MICROWAVE_NORMAL, 10)
|
||||
/obj/machinery/microwave/proc/pre_success(mob/user)
|
||||
loop(MICROWAVE_NORMAL, 10, user)
|
||||
|
||||
/obj/machinery/microwave/proc/muck_finish()
|
||||
visible_message("<span class='warning'>\The [src] gets covered in muck!</span>")
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
if(points)
|
||||
if(I)
|
||||
I.mining_points += points
|
||||
if(usr.client)
|
||||
usr.client.increment_progress("miner", points)
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No ID detected.</span>")
|
||||
|
||||
@@ -68,7 +68,7 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/obj/effect/proc_holder/alien/plant
|
||||
name = "Plant Weeds"
|
||||
desc = "Plants some alien weeds."
|
||||
desc = "Plants Alien weeds which spread resin which heals any alien. These weeds also regenerate plasma faster. Costs 50 Plasma."
|
||||
plasma_cost = 50
|
||||
check_turf = TRUE
|
||||
action_icon_state = "alien_plant"
|
||||
@@ -83,7 +83,7 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/obj/effect/proc_holder/alien/whisper
|
||||
name = "Whisper"
|
||||
desc = "Whisper to someone."
|
||||
desc = "Whisper to someone through the hivemind. Costs 10 Plasma."
|
||||
plasma_cost = 10
|
||||
action_icon_state = "alien_whisper"
|
||||
|
||||
@@ -143,7 +143,7 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/obj/effect/proc_holder/alien/acid
|
||||
name = "Corrosive Acid"
|
||||
desc = "Drench an object in acid, destroying it over time."
|
||||
desc = "Drench an object in acid, destroying it over time. Costs 200 Plasma."
|
||||
plasma_cost = 200
|
||||
action_icon_state = "alien_acid"
|
||||
|
||||
@@ -189,7 +189,7 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/obj/effect/proc_holder/alien/neurotoxin
|
||||
name = "Spit Neurotoxin"
|
||||
desc = "Spits neurotoxin at someone, paralyzing them for a short time."
|
||||
desc = "Activates your Neurotoxin glands. You can shoot paralyzing shots. Each shot costs 50 Plasma."
|
||||
action_icon_state = "alien_neurotoxin_0"
|
||||
active = FALSE
|
||||
|
||||
@@ -254,7 +254,7 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/obj/effect/proc_holder/alien/resin
|
||||
name = "Secrete Resin"
|
||||
desc = "Secrete tough malleable resin."
|
||||
desc = "Secrete tough malleable resin. Costs 55 Plasma."
|
||||
plasma_cost = 55
|
||||
check_turf = TRUE
|
||||
var/list/structures = list(
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/effect/proc_holder/alien/royal/praetorian/evolve
|
||||
name = "Evolve"
|
||||
desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time."
|
||||
desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time. Costs 500 Plasma."
|
||||
plasma_cost = 500
|
||||
|
||||
action_icon_state = "alien_evolve_praetorian"
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
//Queen verbs
|
||||
/obj/effect/proc_holder/alien/lay_egg
|
||||
name = "Lay Egg"
|
||||
desc = "Lay an egg to produce huggers to impregnate prey with."
|
||||
desc = "Lay an egg to produce huggers to impregnate prey with. Costs 75 Plasma."
|
||||
plasma_cost = 75
|
||||
check_turf = TRUE
|
||||
action_icon_state = "alien_egg"
|
||||
@@ -77,7 +77,7 @@
|
||||
//Button to let queen choose her praetorian.
|
||||
/obj/effect/proc_holder/alien/royal/queen/promote
|
||||
name = "Create Royal Parasite"
|
||||
desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian."
|
||||
desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian. Costs 500 Plasma."
|
||||
plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite.
|
||||
|
||||
action_icon_state = "alien_queen_promote"
|
||||
|
||||
@@ -18,3 +18,33 @@
|
||||
species_category = SPECIES_CATEGORY_FURRY
|
||||
|
||||
allowed_limb_ids = list("mammal","aquatic","avian")
|
||||
|
||||
/datum/species/mammal/synthetic
|
||||
name = "Synthetic Anthromorph"
|
||||
id = SPECIES_MAMMAL_SYNTHETIC
|
||||
|
||||
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE,WINGCOLOR,HORNCOLOR)
|
||||
inherent_traits = list(TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NO_PROCESS_FOOD, TRAIT_ROBOTIC_ORGANISM)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID|MOB_BEAST
|
||||
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
|
||||
gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless)
|
||||
//Just robo looking parts.
|
||||
mutant_heart = /obj/item/organ/heart/ipc
|
||||
mutantlungs = /obj/item/organ/lungs/ipc
|
||||
mutantliver = /obj/item/organ/liver/ipc
|
||||
mutantstomach = /obj/item/organ/stomach/ipc
|
||||
mutanteyes = /obj/item/organ/eyes/ipc
|
||||
mutantears = /obj/item/organ/ears/ipc
|
||||
mutanttongue = /obj/item/organ/tongue/robot/ipc
|
||||
mutant_brain = /obj/item/organ/brain/ipc
|
||||
|
||||
//special cybernetic organ for getting power from apcs
|
||||
mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord)
|
||||
|
||||
|
||||
attack_verb = "claw"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
allowed_limb_ids = list("mammal","aquatic","avian", "human")
|
||||
|
||||
@@ -203,6 +203,15 @@
|
||||
var/obj/item/I = AM
|
||||
if(I.light_range && I.light_power)
|
||||
disintegrate(I)
|
||||
else if (isstructure(AM))
|
||||
var/obj/structure/S = AM
|
||||
if(istype(S, /obj/structure/glowshroom) || istype(S, /obj/structure/marker_beacon))
|
||||
qdel(S)
|
||||
visible_message("<span class='danger'>[S] is disintegrated by [src]!</span>")
|
||||
else if(AM.light_range && AM.light_power && !(istype(AM, /obj/machinery/power/apc) || istype(AM, /obj/machinery/airalarm)))
|
||||
var/obj/target_object = AM
|
||||
target_object.take_damage(force * 5, BRUTE, "melee", 0)
|
||||
|
||||
|
||||
/obj/item/light_eater/proc/disintegrate(obj/item/O)
|
||||
if(istype(O, /obj/item/pda))
|
||||
|
||||
@@ -508,7 +508,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
if(LOG_EMOTE)
|
||||
colored_message = "(EMOTE) [colored_message]"
|
||||
|
||||
var/list/timestamped_message = list("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)]" = colored_message)
|
||||
var/list/timestamped_message = list("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message)
|
||||
|
||||
logging[smessage_type] += timestamped_message
|
||||
|
||||
|
||||
@@ -257,9 +257,9 @@
|
||||
var/amount = text2num(params["amount"])
|
||||
if(amount == null)
|
||||
amount = text2num(input(usr,
|
||||
"Max 10. Buffer content will be split evenly.",
|
||||
"Max 20. Buffer content will be split evenly.",
|
||||
"How many to make?", 1))
|
||||
amount = clamp(round(amount), 0, 10)
|
||||
amount = clamp(round(amount), 0, 20)
|
||||
if (amount <= 0)
|
||||
return FALSE
|
||||
// Get units per item
|
||||
|
||||
@@ -104,3 +104,11 @@
|
||||
build_path = /obj/item/circuitboard/machine/thermomachine
|
||||
category = list ("Engineering Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/board/spaceship_navigation_beacon
|
||||
name = "Machine Design (Bluespace Navigation Gigabeacon)"
|
||||
desc = "The circuit board for a Bluespace Navigation Gigabeacon."
|
||||
id = "spaceship_navigation_beacon"
|
||||
build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon
|
||||
category = list ("Teleportation Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
@@ -726,6 +726,32 @@
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/////////////////////
|
||||
/////Synth Organs////
|
||||
/////////////////////
|
||||
|
||||
/datum/design/ipc_stomach
|
||||
name = "IPC cell"
|
||||
desc = "Effectively the robot equivalent of a stomach, handling power storage."
|
||||
id = "ipc_stomach"
|
||||
build_type = PROTOLATHE | MECHFAB
|
||||
construction_time = 40
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 300, /datum/material/silver = 500, /datum/material/gold = 400)
|
||||
build_path = /obj/item/organ/stomach/ipc
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/cyberimp_power_cord
|
||||
name = "IPC power cord"
|
||||
desc = "A implant for Robots designed to siphon power from APCs to recharge their own cell."
|
||||
id = "ci-power-cord"
|
||||
build_type = PROTOLATHE | MECHFAB
|
||||
construction_time = 75
|
||||
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1500, /datum/material/silver = 1200, /datum/material/gold = 1600, /datum/material/plasma = 1000)
|
||||
build_path = /obj/item/organ/cyberimp/arm/power_cord
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/////////////////////
|
||||
///Surgery Designs///
|
||||
/////////////////////
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
display_name = "Biological Technology"
|
||||
description = "What makes us tick." //the MC, silly!
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner","chem_pack")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner","chem_pack", "portable_chem_mixer")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/adv_biotech
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
display_name = "Basic Shuttle Research"
|
||||
description = "Research the technology required to create and use basic shuttles."
|
||||
prereq_ids = list("practical_bluespace", "adv_engi")
|
||||
design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker")
|
||||
design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker","spaceship_navigation_beacon")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
|
||||
/datum/techweb_node/shuttle_route_upgrade
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
display_name = "Upgraded Cybernetic Organs"
|
||||
description = "We have the technology to upgrade him."
|
||||
prereq_ids = list("cyber_organs")
|
||||
design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u")
|
||||
design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u", "ipc_stomach")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
|
||||
|
||||
/datum/techweb_node/cyber_implants
|
||||
@@ -88,7 +88,7 @@
|
||||
display_name = "Cybernetic Implants"
|
||||
description = "Electronic implants that improve humans."
|
||||
prereq_ids = list("adv_biotech", "adv_datatheory")
|
||||
design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service")
|
||||
design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service", "ci-power-cord")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/adv_cyber_implants
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes
|
||||
var/obj/docking_port/stationary/my_port //the custom docking port placed by this console
|
||||
var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle
|
||||
var/list/locked_traits = list(ZTRAIT_RESERVED, ZTRAIT_CENTCOM, ZTRAIT_AWAY, ZTRAIT_REEBE) //traits forbided for custom docking
|
||||
var/view_range = 0
|
||||
var/x_offset = 0
|
||||
var/y_offset = 0
|
||||
@@ -186,7 +187,7 @@
|
||||
var/turf/eyeturf = get_turf(the_eye)
|
||||
if(!eyeturf)
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
if(z_lock.len && !(eyeturf.z in z_lock))
|
||||
if(!eyeturf.z || SSmapping.level_has_any_trait(eyeturf.z, locked_traits))
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
|
||||
. = SHUTTLE_DOCKER_LANDING_CLEAR
|
||||
@@ -224,9 +225,9 @@
|
||||
if(hidden_turf_info)
|
||||
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
|
||||
|
||||
if(space_turfs_only)
|
||||
if(length(whitelist_turfs))
|
||||
var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type
|
||||
if(!ispath(turf_type, /turf/open/space))
|
||||
if(!is_type_in_typecache(turf_type, whitelist_turfs))
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
|
||||
if(length(whitelist_turfs))
|
||||
@@ -324,12 +325,25 @@
|
||||
var/list/L = list()
|
||||
for(var/V in SSshuttle.stationary)
|
||||
if(!V)
|
||||
stack_trace("SSshuttle.stationary have null entry!")
|
||||
continue
|
||||
var/obj/docking_port/stationary/S = V
|
||||
if(console.z_lock.len && !(S.z in console.z_lock))
|
||||
continue
|
||||
if(console.jumpto_ports[S.id])
|
||||
L[S.name] = S
|
||||
L["([L.len])[S.name]"] = S
|
||||
|
||||
for(var/V in SSshuttle.beacons)
|
||||
if(!V)
|
||||
stack_trace("SSshuttle.beacons have null entry!")
|
||||
continue
|
||||
var/obj/machinery/spaceship_navigation_beacon/nav_beacon = V
|
||||
if(!nav_beacon.z || SSmapping.level_has_any_trait(nav_beacon.z, console.locked_traits))
|
||||
break
|
||||
if(!nav_beacon.locked)
|
||||
L["([L.len]) [nav_beacon.name] located: [nav_beacon.x] [nav_beacon.y] [nav_beacon.z]"] = nav_beacon
|
||||
else
|
||||
L["([L.len]) [nav_beacon.name] locked"] = null
|
||||
|
||||
playsound(console, 'sound/machines/terminal_prompt.ogg', 25, 0)
|
||||
var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
/obj/item/circuitboard/machine/spaceship_navigation_beacon
|
||||
name = "Bluespace Navigation Gigabeacon (Machine Board)"
|
||||
build_path = /obj/machinery/spaceship_navigation_beacon
|
||||
req_components = list()
|
||||
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon
|
||||
name = "Bluespace Navigation Gigabeacon"
|
||||
desc = "A device that creates a bluespace anchor that allow ships jump near to it."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "core"
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 0
|
||||
density = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon
|
||||
|
||||
var/locked = FALSE //Locked beacons don't allow to jump to it.
|
||||
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/Initialize()
|
||||
. = ..()
|
||||
SSshuttle.beacons |= src
|
||||
|
||||
obj/machinery/spaceship_navigation_beacon/emp_act()
|
||||
locked = TRUE
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/Destroy()
|
||||
SSshuttle.beacons -= src
|
||||
return ..()
|
||||
|
||||
// update the icon_state
|
||||
/obj/machinery/spaceship_navigation_beacon/update_icon()
|
||||
if(powered())
|
||||
icon_state = "core"
|
||||
else
|
||||
icon_state = "core-open"
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/power_change()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if(panel_open)
|
||||
var/new_name = "Beacon_[input("Enter the custom name for this beacon", "It be Beacon ..your input..") as text]"
|
||||
if(new_name && Adjacent(user))
|
||||
name = new_name
|
||||
to_chat(user, "<span class='notice'>You change beacon name to [name].</span>")
|
||||
else
|
||||
locked =!locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "" : "un"]lock [src].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/examine()
|
||||
.=..()
|
||||
. += "<span class='[locked ? "warning" : "nicegreen"]'>Status: [locked ? "LOCKED" : "Stable"] </span>"
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "core-open", "core", W))
|
||||
return
|
||||
if(default_deconstruction_crowbar(W))
|
||||
return
|
||||
|
||||
return ..()
|
||||
@@ -394,11 +394,10 @@
|
||||
var/datum/wound/new_wound
|
||||
if(replaced_wound)
|
||||
new_wound = replaced_wound.replace_wound(possible_wound)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned
|
||||
else
|
||||
new_wound = new possible_wound
|
||||
new_wound.apply_wound(src)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned
|
||||
return new_wound
|
||||
|
||||
// try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
/obj/item/clothing/glasses/sunglasses/gar/supergar = 1,
|
||||
/obj/item/clothing/gloves/color/captain = 1)
|
||||
refill_canister = /obj/item/vending_refill/wardrobe/cap_wardrobe
|
||||
payment_department = ACCOUNT_CIV
|
||||
payment_department = ACCOUNT_SEC
|
||||
default_price = PRICE_ALMOST_EXPENSIVE
|
||||
extra_price = PRICE_ABOVE_EXPENSIVE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user