Merge branch 'master' of https://github.com/PolarisSS13/Polaris into CivilianExpansion1

This commit is contained in:
Mechoid
2019-06-26 16:17:58 -07:00
98 changed files with 2033 additions and 867 deletions

View File

@@ -47,6 +47,7 @@
// Damage above this value must be repaired with surgery.
#define ROBOLIMB_REPAIR_CAP 30
#define ORGAN_FLESH 0 // Normal organic organs.
#define ORGAN_ASSISTED 1 // Like pacemakers, not robotic
#define ORGAN_ROBOT 2 // Fully robotic, no organic parts
#define ORGAN_LIFELIKE 3 // Robotic, made to appear organic

View File

@@ -16,6 +16,8 @@
#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays. This also should be the transparancy of the "soft_dark" icon state.
#define LIGHTING_MULT_FACTOR 0.5
// If I were you I'd leave this alone.
#define LIGHTING_BASE_MATRIX \
list \
@@ -77,7 +79,7 @@
//Lighting values used by the station lights
#define LIGHT_COLOR_FLUORESCENT_TUBE "#E0EFFF"
#define LIGHT_COLOR_FLUORESCENT_FLASHLIGHT "#CDDDFF"
#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFEEDD"
#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFFEB8"
#define LIGHT_COLOR_INCANDESCENT_BULB "#FFDDBB"
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"

View File

@@ -354,4 +354,4 @@ var/global/list/##LIST_NAME = list();\
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
#define MOUSE_OPACITY_TRANSPARENT 0
#define MOUSE_OPACITY_ICON 1
#define MOUSE_OPACITY_OPAQUE 2
#define MOUSE_OPACITY_OPAQUE 2

View File

@@ -196,6 +196,9 @@
#define O_VOICE "voicebox"
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE)
// Augments
#define O_AUG_TSHADE "integrated thermolensing implant"
// Non-Standard organs
#define O_MOUTH "mouth"
#define O_CELL "cell"

View File

@@ -6,7 +6,8 @@ var/datum/category_collection/autolathe/autolathe_recipes
if(I.matter && !resources)
resources = list()
for(var/material in I.matter)
resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle.
var/coeff = (no_scale ? 1 : 1.25) //most objects are more expensive to produce than to recycle
resources[material] = I.matter[material]*coeff // but if it's a sheet or RCD cartridge, it's 1:1
if(is_stack && istype(I, /obj/item/stack))
var/obj/item/stack/IS = I
max_stack = IS.max_amount
@@ -66,6 +67,7 @@ var/datum/category_collection/autolathe/autolathe_recipes
var/power_use = 0
var/is_stack
var/max_stack
var/no_scale
/datum/category_item/autolathe/dd_SortValue()
return name

View File

@@ -93,6 +93,7 @@
/datum/category_item/autolathe/engineering/rcd_ammo
name = "matter cartridge"
path =/obj/item/weapon/rcd_ammo
no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/engineering/rcd
name = "rapid construction device"

View File

@@ -73,22 +73,26 @@
/datum/category_item/autolathe/general/metal
name = "steel sheets"
path =/obj/item/stack/material/steel
is_stack = 1
is_stack = TRUE
no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/glass
name = "glass sheets"
path =/obj/item/stack/material/glass
is_stack = 1
is_stack = TRUE
no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/rglass
name = "reinforced glass sheets"
path =/obj/item/stack/material/glass/reinforced
is_stack = 1
is_stack = TRUE
no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/rods
name = "metal rods"
path =/obj/item/stack/rods
is_stack = 1
is_stack = TRUE
no_scale = TRUE //prevents material duplication exploits
/datum/category_item/autolathe/general/knife
name = "kitchen knife"

View File

@@ -32,7 +32,7 @@
genomecost = 1
verbpath = /mob/proc/changeling_claw
//Grows a scary, and powerful arm blade.
//Grows a scary, and powerful claw.
/mob/proc/changeling_claw()
set category = "Changeling"
set name = "Claw (15)"
@@ -62,6 +62,9 @@
var/weapType = "weapon"
var/weapLocation = "arm"
defend_chance = 40 // The base chance for the weapon to parry.
projectile_parry_chance = 15 // The base chance for a projectile to be deflected.
/obj/item/weapon/melee/changeling/New(location)
..()
START_PROCESSING(SSobj, src)
@@ -107,6 +110,28 @@
if(src)
qdel(src)
/obj/item/weapon/melee/changeling/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(defend_chance))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/slash.ogg', 50, 1)
return 1
if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/slash.ogg', 50, 1)
return 1
return 0
/obj/item/weapon/melee/changeling/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile))
return 0
var/bad_arc = reverse_direction(user.dir)
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
return 0
return 1
/obj/item/weapon/melee/changeling/arm_blade
name = "arm blade"
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
@@ -117,11 +142,15 @@
edge = 1
pry = 1
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
defend_chance = 60
projectile_parry_chance = 25
/obj/item/weapon/melee/changeling/arm_blade/greater
name = "arm greatblade"
desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
armor_penetration = 30
defend_chance = 70
projectile_parry_chance = 35
/obj/item/weapon/melee/changeling/claw
name = "hand claw"
@@ -131,9 +160,13 @@
sharp = 1
edge = 1
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
defend_chance = 50
projectile_parry_chance = 15
/obj/item/weapon/melee/changeling/claw/greater
name = "hand greatclaw"
force = 20
armor_penetration = 20
pry = 1
pry = 1
defend_chance = 60
projectile_parry_chance = 25

View File

@@ -83,16 +83,17 @@
else
//Make sure it's buildable and list requires resources.
for(var/material in R.resources)
var/sheets = round(stored_material[material]/round(R.resources[material]*mat_efficiency))
var/coeff = (R.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
var/sheets = round(stored_material[material]/round(R.resources[material]*coeff))
if(isnull(max_sheets) || max_sheets > sheets)
max_sheets = sheets
if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*mat_efficiency))
if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*coeff))
can_make = 0
if(!comma)
comma = 1
else
material_string += ", "
material_string += "[round(R.resources[material] * mat_efficiency)] [material]"
material_string += "[round(R.resources[material] * coeff)] [material]"
material_string += ".<br></td>"
//Build list of multipliers for sheets.
if(R.is_stack)
@@ -251,15 +252,16 @@
update_use_power(2)
//Check if we still have the materials.
var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
for(var/material in making.resources)
if(!isnull(stored_material[material]))
if(stored_material[material] < round(making.resources[material] * mat_efficiency) * multiplier)
if(stored_material[material] < round(making.resources[material] * coeff) * multiplier)
return
//Consume materials.
for(var/material in making.resources)
if(!isnull(stored_material[material]))
stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * mat_efficiency) * multiplier)
stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * coeff) * multiplier)
update_icon() // So lid closes

View File

@@ -706,6 +706,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 5,

View File

@@ -120,4 +120,53 @@
..()
if (href_list["toggle_leg_overload"])
src.overload()
return
/obj/mecha/combat/gygax/serenity
desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax."
name = "Serenity"
icon_state = "medgax"
initial_icon = "medgax"
health = 150
maxhealth = 150
deflect_chance = 20
step_in = 2
damage_absorption = list("brute"=0.9,"fire"=1,"bullet"=0.9,"laser"=0.8,"energy"=0.9,"bomb"=1)
max_temperature = 20000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/serenity
max_equip = 3
step_energy_drain = 8
cargo_capacity = 2
max_hull_equip = 1
max_weapon_equip = 1
max_utility_equip = 2
max_universal_equip = 1
max_special_equip = 1
var/obj/item/clothing/glasses/hud/health/mech/hud
/obj/mecha/combat/gygax/serenity/New()
..()
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
return
/obj/mecha/combat/gygax/serenity/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
if(H.glasses)
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
else
H.glasses = hud
H.recalculate_vis()
return 1
else
return 0
/obj/mecha/combat/gygax/serenity/go_out()
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(H.glasses == hud)
H.glasses = null
H.recalculate_vis()
..()
return

View File

@@ -560,8 +560,294 @@
feedback_inc("mecha_gygax_created",1)
return
//////////////////////
// Serenity
//////////////////////
/datum/construction/mecha/serenity_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/gygax_torso),//1
list("key"=/obj/item/mecha_parts/part/gygax_left_arm),//2
list("key"=/obj/item/mecha_parts/part/gygax_right_arm),//3
list("key"=/obj/item/mecha_parts/part/gygax_left_leg),//4
list("key"=/obj/item/mecha_parts/part/gygax_right_leg),//5
list("key"=/obj/item/mecha_parts/part/gygax_head)
)
/datum/construction/mecha/serenity_chassis/custom_action(step, obj/item/I, mob/user)
user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
holder.overlays += I.icon_state+"+o"
qdel(I)
return 1
/datum/construction/mecha/serenity_chassis/action(obj/item/I,mob/user as mob)
return check_all_steps(I,user)
/datum/construction/mecha/serenity_chassis/spawn_result()
var/obj/item/mecha_parts/chassis/const_holder = holder
const_holder.construct = new /datum/construction/reversible/mecha/serenity(const_holder)
const_holder.icon = 'icons/mecha/mech_construction.dmi'
const_holder.icon_state = "gygax0"
const_holder.density = 1
spawn()
qdel(src)
return
/datum/construction/reversible/mecha/serenity
result = "/obj/mecha/combat/gygax/serenity"
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
"backkey"=IS_WRENCH,
"desc"="External armor is wrenched."),
//2
list("key"=IS_WRENCH,
"backkey"=IS_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Internal armor is welded."),
//4
list("key"=/obj/item/weapon/weldingtool,
"backkey"=IS_WRENCH,
"desc"="Internal armor is wrenched"),
//5
list("key"=IS_WRENCH,
"backkey"=IS_CROWBAR,
"desc"="Internal armor is installed"),
//6
list("key"=/obj/item/stack/material/steel,
"backkey"=IS_SCREWDRIVER,
"desc"="Advanced capacitor is secured"),
//7
list("key"=IS_SCREWDRIVER,
"backkey"=IS_CROWBAR,
"desc"="Advanced capacitor is installed"),
//8
list("key"=/obj/item/weapon/stock_parts/capacitor/adv,
"backkey"=IS_SCREWDRIVER,
"desc"="Advanced scanner module is secured"),
//9
list("key"=IS_SCREWDRIVER,
"backkey"=IS_CROWBAR,
"desc"="Advanced scanner module is installed"),
//10
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv,
"backkey"=IS_SCREWDRIVER,
"desc"="Medical module is secured"),
//11
list("key"=IS_SCREWDRIVER,
"backkey"=IS_CROWBAR,
"desc"="Medical module is installed"),
//12
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/medical,
"backkey"=IS_SCREWDRIVER,
"desc"="Peripherals control module is secured"),
//13
list("key"=IS_SCREWDRIVER,
"backkey"=IS_CROWBAR,
"desc"="Peripherals control module is installed"),
//14
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/peripherals,
"backkey"=IS_SCREWDRIVER,
"desc"="Central control module is secured"),
//15
list("key"=IS_SCREWDRIVER,
"backkey"=IS_CROWBAR,
"desc"="Central control module is installed"),
//16
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/main,
"backkey"=IS_SCREWDRIVER,
"desc"="The wiring is adjusted"),
//17
list("key"=/obj/item/weapon/tool/wirecutters,
"backkey"=IS_SCREWDRIVER,
"desc"="The wiring is added"),
//18
list("key"=/obj/item/stack/cable_coil,
"backkey"=IS_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//19
list("key"=IS_SCREWDRIVER,
"backkey"=IS_WRENCH,
"desc"="The hydraulic systems are connected."),
//20
list("key"=IS_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
/datum/construction/reversible/mecha/serenity/action(obj/item/I,mob/user as mob)
return check_step(I,user)
/datum/construction/reversible/mecha/serenity/custom_action(index, diff, obj/item/I, mob/user)
if(!..())
return 0
//TODO: better messages.
switch(index)
if(20)
user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
holder.icon_state = "gygax1"
if(19)
if(diff==FORWARD)
user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
holder.icon_state = "gygax2"
else
user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
holder.icon_state = "gygax0"
if(18)
if(diff==FORWARD)
user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
holder.icon_state = "gygax3"
else
user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
holder.icon_state = "gygax1"
if(17)
if(diff==FORWARD)
user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
holder.icon_state = "gygax4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
holder.icon_state = "gygax2"
if(16)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
qdel(I)
holder.icon_state = "gygax5"
else
user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
holder.icon_state = "gygax3"
if(15)
if(diff==FORWARD)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
holder.icon_state = "gygax6"
else
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder))
holder.icon_state = "gygax4"
if(14)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
qdel(I)
holder.icon_state = "gygax7"
else
user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
holder.icon_state = "gygax5"
if(13)
if(diff==FORWARD)
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
holder.icon_state = "gygax8"
else
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder))
holder.icon_state = "gygax6"
if(12)
if(diff==FORWARD)
user.visible_message("[user] installs the medical control module into [holder].", "You install the medical control module into [holder].")
qdel(I)
holder.icon_state = "gygax9"
else
user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
holder.icon_state = "gygax7"
if(11)
if(diff==FORWARD)
user.visible_message("[user] secures the medical control module.", "You secure the medical control module.")
holder.icon_state = "gygax10"
else
user.visible_message("[user] removes the medical control module from [holder].", "You remove the medical control module from [holder].")
new /obj/item/weapon/circuitboard/mecha/gygax/medical(get_turf(holder))
holder.icon_state = "gygax8"
if(10)
if(diff==FORWARD)
user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
qdel(I)
holder.icon_state = "gygax11"
else
user.visible_message("[user] unfastens the medical control module.", "You unfasten the medical control module.")
holder.icon_state = "gygax9"
if(9)
if(diff==FORWARD)
user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
holder.icon_state = "gygax12"
else
user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
holder.icon_state = "gygax10"
if(8)
if(diff==FORWARD)
user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
qdel(I)
holder.icon_state = "gygax13"
else
user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
holder.icon_state = "gygax11"
if(7)
if(diff==FORWARD)
user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
holder.icon_state = "gygax14"
else
user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
holder.icon_state = "gygax12"
if(6)
if(diff==FORWARD)
user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
holder.icon_state = "gygax15"
else
user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
holder.icon_state = "gygax13"
if(5)
if(diff==FORWARD)
user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
holder.icon_state = "gygax16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You pry the internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
holder.icon_state = "gygax14"
if(4)
if(diff==FORWARD)
user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
holder.icon_state = "gygax17"
else
user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
holder.icon_state = "gygax15"
if(3)
if(diff==FORWARD)
user.visible_message("[user] installs the external armor layer to [holder].", "You install the external armor layer to [holder].")
qdel(I)
holder.icon_state = "gygax18"
else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
holder.icon_state = "gygax16"
if(2)
if(diff==FORWARD)
user.visible_message("[user] secures the external armor layer.", "You secure the external armor layer.")
holder.icon_state = "gygax19-s"
else
user.visible_message("[user] pries the external armor layer from [holder].", "You pry the external armor layer from [holder].")
new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder))
holder.icon_state = "gygax17"
if(1)
if(diff==FORWARD)
user.visible_message("[user] welds the external armor layer to [holder].", "You weld the external armor layer to [holder].")
else
user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
holder.icon_state = "gygax18"
return 1
/datum/construction/reversible/mecha/serenity/spawn_result()
..()
feedback_inc("mecha_serenity_created",1)
return
////////////////////////
// Firfighter
// Firefighter
////////////////////////
/datum/construction/mecha/firefighter_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1

View File

@@ -1,4 +1,4 @@
/////////////////////////
/////////////////////////
////// Mecha Parts //////
/////////////////////////
@@ -112,6 +112,14 @@
icon_state = "gygax_armour"
origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINEERING = 5)
////////// Serenity
/obj/item/mecha_parts/chassis/serenity
name = "Serenity Chassis"
New()
..()
construct = new /datum/construction/mecha/serenity_chassis(src)
//////////// Durand

View File

@@ -107,6 +107,10 @@
name = "Medgax wreckage"
icon_state = "medgax-broken"
/obj/effect/decal/mecha_wreckage/gygax/serenity
name = "Serenity wreckage"
icon_state = "medgax-broken"
/obj/effect/decal/mecha_wreckage/marauder
name = "Marauder wreckage"
icon_state = "marauder-broken"

View File

@@ -4,30 +4,14 @@
/obj/item/weapon/storage/pill_bottle/happy
name = "bottle of Happy pills"
desc = "Highly illegal drug. When you want to see the rainbow."
/obj/item/weapon/storage/pill_bottle/happy/New()
..()
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
new /obj/item/weapon/reagent_containers/pill/happy( src )
wrapper_color = COLOR_PINK
starts_with = list(/obj/item/weapon/reagent_containers/pill/happy = 7)
/obj/item/weapon/storage/pill_bottle/zoom
name = "bottle of Zoom pills"
desc = "Highly illegal drug. Trade brain for speed."
/obj/item/weapon/storage/pill_bottle/zoom/New()
..()
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
new /obj/item/weapon/reagent_containers/pill/zoom( src )
wrapper_color = COLOR_BLUE
starts_with = list(/obj/item/weapon/reagent_containers/pill/zoom = 7)
/obj/item/weapon/reagent_containers/glass/beaker/vial/random
flags = 0

View File

@@ -121,48 +121,18 @@
/obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)
if(target.status != LIGHT_OK)
if(CanUse(U))
if(!Use(U)) return
U << "<span class='notice'>You replace the [target.fitting] with the [src].</span>"
if(target.status == LIGHT_OK)
to_chat(U, "There is a working [target.get_fitting_name()] already inserted.")
else if(!CanUse(U))
to_chat(U, failmsg)
else if(Use(U))
to_chat(U, "<span class='notice'>You replace the [target.get_fitting_name()] with the [src].</span>")
if(target.status != LIGHT_EMPTY)
if(target.status != LIGHT_EMPTY)
target.remove_bulb()
var/obj/item/weapon/light/L1 = new target.light_type(target.loc)
L1.status = target.status
L1.rigged = target.rigged
L1.brightness_range = target.brightness_range
L1.brightness_power = target.brightness_power
L1.brightness_color = target.brightness_color
L1.switchcount = target.switchcount
target.switchcount = 0
L1.update()
target.status = LIGHT_EMPTY
target.update()
var/obj/item/weapon/light/L2 = new target.light_type()
target.status = L2.status
target.switchcount = L2.switchcount
target.rigged = emagged
target.brightness_range = L2.brightness_range
target.brightness_power = L2.brightness_power
target.brightness_color = L2.brightness_color
target.on = target.has_power()
target.update()
qdel(L2)
if(target.on && target.rigged)
target.explode()
return
else
U << failmsg
return
else
U << "There is a working [target.fitting] already inserted."
return
var/obj/item/weapon/light/L = new target.light_type()
target.insert_bulb(L)
/obj/item/device/lightreplacer/emag_act(var/remaining_charges, var/mob/user)
emagged = !emagged

View File

@@ -211,7 +211,7 @@ HALOGEN COUNTER - Radcount on mobs
continue
// Broken limbs
if(e.status & ORGAN_BROKEN)
if((e.name in list("l_arm", "r_arm", "l_leg", "r_leg")) && (!e.splinted))
if((e.name in list("l_arm", "r_arm", "l_leg", "r_leg", "head", "chest", "groin")) && (!e.splinted))
fracture_dat += "<span class='warning'>Unsecured fracture in subject [e.name]. Splinting recommended for transport.</span><br>"
else if(advscan >= 1 && showadvscan == 1)
fracture_dat += "<span class='warning'>Bone fractures detected in subject [e.name].</span><br>"

View File

@@ -270,12 +270,12 @@
/obj/item/stack/medical/splint
name = "medical splints"
singular_name = "medical splint"
desc = "Modular splints capable of supporting and immobilizing bones in both limbs and appendages."
desc = "Modular splints capable of supporting and immobilizing bones in all areas of the body."
icon_state = "splint"
amount = 5
max_amount = 5
var/list/splintable_organs = list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT) //List of organs you can splint, natch.
var/list/splintable_organs = list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO) //List of organs you can splint, natch.
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob)
if(..())

View File

@@ -32,6 +32,11 @@
icon_state = "mcontroller"
origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
/obj/item/weapon/circuitboard/mecha/gygax/medical
name = T_BOARD_MECHA("Serenity medical control")
icon_state = "mcontroller"
origin_tech = list(TECH_DATA = 4, TECH_BIO = 4)
/obj/item/weapon/circuitboard/mecha/gygax/main
name = T_BOARD_MECHA("Gygax central control")
icon_state = "mainboard"

View File

@@ -11,8 +11,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/material/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(50))
if(unique_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1

View File

@@ -0,0 +1,31 @@
/*
* The home of basic deflect / defense code.
*/
/obj/item/weapon/melee
var/defend_chance = 5 // The base chance for the weapon to parry.
var/projectile_parry_chance = 0 // The base chance for a projectile to be deflected.
/obj/item/weapon/melee/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(.)
return .
if(default_parry_check(user, attacker, damage_source) && prob(defend_chance))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
return 1
if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
return 1
return 0
/obj/item/weapon/melee/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
if(.)
return .
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile))
return 0
var/bad_arc = reverse_direction(user.dir)
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
return 0
return 1

View File

@@ -127,6 +127,8 @@
var/random_color = TRUE
var/active_state = "sword"
projectile_parry_chance = 65
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
..()
if(!istype(loc,/mob))
@@ -173,7 +175,7 @@
icon_state = initial(icon_state)
/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
if(active && default_parry_check(user, attacker, damage_source) && prob(60))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
@@ -181,8 +183,27 @@
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
if(active && unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
return 0
/obj/item/weapon/melee/energy/sword/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile/))
return 0
var/bad_arc = reverse_direction(user.dir)
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
return 0
return 1
/obj/item/weapon/melee/energy/sword/pirate
name = "energy cutlass"
desc = "Arrrr matey."
@@ -215,6 +236,7 @@
lpower = 2
lcolor = "#0000FF"
active_state = "ionic_rapier"
projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life.
/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
if(istype(AM, /obj) && proximity && active)
@@ -250,6 +272,7 @@
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
active_force = 25
armor_penetration = 25
projectile_parry_chance = 40
var/hitcost = 75
var/obj/item/weapon/cell/bcell = null
@@ -336,6 +359,7 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/mob/living/creator
var/datum/effect/effect/system/spark_spread/spark_system
projectile_parry_chance = 60
lcolor = "#00FF00"
/obj/item/weapon/melee/energy/blade/New()
@@ -373,6 +397,37 @@
host.drop_from_inventory(src)
spawn(1) if(src) qdel(src)
/obj/item/weapon/melee/energy/blade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(60))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
return 0
/obj/item/weapon/melee/energy/blade/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile/))
return 0
var/bad_arc = reverse_direction(user.dir)
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
return 0
return 1
/*
*Energy Spear
*/

View File

@@ -29,6 +29,9 @@
return 1
/obj/item/proc/unique_parry_check(mob/user, mob/attacker, atom/damage_source) // An overrideable version of the above proc.
return default_parry_check(user, attacker, damage_source)
/obj/item/weapon/shield
name = "shield"
var/base_block_chance = 50

View File

@@ -174,15 +174,25 @@
use_sound = null
max_storage_space = ITEMSIZE_COST_TINY * 14
max_w_class = ITEMSIZE_TINY
var/wrapper_color
var/label
var/label_text = ""
var/base_name = " "
var/base_desc = " "
/obj/item/weapon/storage/pill_bottle/New()
..()
/obj/item/weapon/storage/pill_bottle/Initialize()
. = ..()
base_name = name
base_desc = desc
update_icon()
/obj/item/weapon/storage/pill_bottle/update_icon()
overlays.Cut()
if(wrapper_color)
var/image/I = image(icon, "pillbottle_wrap")
I.color = wrapper_color
overlays += I
/obj/item/weapon/storage/pill_bottle/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
@@ -213,61 +223,71 @@
desc = "[base_desc] It is labeled \"[label_text]\"."
/obj/item/weapon/storage/pill_bottle/antitox
name = "bottle of Dylovene pills"
name = "pill bottle (Dylovene)"
desc = "Contains pills used to counter toxins."
starts_with = list(/obj/item/weapon/reagent_containers/pill/antitox = 7)
wrapper_color = COLOR_GREEN
/obj/item/weapon/storage/pill_bottle/bicaridine
name = "bottle of Bicaridine pills"
name = "pill bottle (Bicaridine)"
desc = "Contains pills used to stabilize the severely injured."
starts_with = list(/obj/item/weapon/reagent_containers/pill/bicaridine = 7)
wrapper_color = COLOR_MAROON
/obj/item/weapon/storage/pill_bottle/dexalin_plus
name = "bottle of Dexalin Plus pills"
name = "pill bottle (Dexalin Plus)"
desc = "Contains pills used to treat extreme cases of oxygen deprivation."
starts_with = list(/obj/item/weapon/reagent_containers/pill/dexalin_plus = 7)
wrapper_color = "#3366cc"
/obj/item/weapon/storage/pill_bottle/dermaline
name = "bottle of Dermaline pills"
name = "pill bottle (Dermaline)"
desc = "Contains pills used to treat burn wounds."
starts_with = list(/obj/item/weapon/reagent_containers/pill/dermaline = 7)
wrapper_color = "#e8d131"
/obj/item/weapon/storage/pill_bottle/dylovene
name = "bottle of Dylovene pills"
name = "pill bottle (Dylovene)"
desc = "Contains pills used to treat toxic substances in the blood."
starts_with = list(/obj/item/weapon/reagent_containers/pill/dylovene = 7)
wrapper_color = COLOR_GREEN
/obj/item/weapon/storage/pill_bottle/inaprovaline
name = "bottle of Inaprovaline pills"
name = "pill bottle (Inaprovaline)"
desc = "Contains pills used to stabilize patients."
starts_with = list(/obj/item/weapon/reagent_containers/pill/inaprovaline = 7)
wrapper_color = COLOR_PALE_BLUE_GRAY
/obj/item/weapon/storage/pill_bottle/kelotane
name = "bottle of kelotane pills"
name = "pill bottle (Kelotane)"
desc = "Contains pills used to treat burns."
starts_with = list(/obj/item/weapon/reagent_containers/pill/kelotane = 7)
wrapper_color = "#ec8b2f"
/obj/item/weapon/storage/pill_bottle/spaceacillin
name = "bottle of Spaceacillin pills"
name = "pill bottle (Spaceacillin)"
desc = "A theta-lactam antibiotic. Effective against many diseases likely to be encountered in space."
starts_with = list(/obj/item/weapon/reagent_containers/pill/spaceacillin = 7)
wrapper_color = COLOR_PALE_GREEN_GRAY
/obj/item/weapon/storage/pill_bottle/tramadol
name = "bottle of Tramadol pills"
name = "pill bottle (Tramadol)"
desc = "Contains pills used to relieve pain."
starts_with = list(/obj/item/weapon/reagent_containers/pill/tramadol = 7)
wrapper_color = COLOR_PURPLE_GRAY
/obj/item/weapon/storage/pill_bottle/citalopram
name = "bottle of Citalopram pills"
name = "pill bottle (Citalopram)"
desc = "Contains pills used to stabilize a patient's mood."
starts_with = list(/obj/item/weapon/reagent_containers/pill/citalopram = 7)
wrapper_color = COLOR_GRAY
/obj/item/weapon/storage/pill_bottle/carbon
name = "bottle of Carbon pills"
name = "pill bottle (Carbon)"
desc = "Contains pills used to neutralise chemicals in the stomach."
starts_with = list(/obj/item/weapon/reagent_containers/pill/carbon = 7)
/obj/item/weapon/storage/pill_bottle/iron
name = "bottle of Iron pills"
name = "pill bottle (Iron)"
desc = "Contains pills used to aid in blood regeneration."
starts_with = list(/obj/item/weapon/reagent_containers/pill/iron = 7)

View File

@@ -11,7 +11,15 @@
. = ..()
if (!prob(spawn_nothing_percentage))
spawn_item()
Random_SafeDestroy(0)
// This function should, theoretically, guarantee the deletion of the random object. Not all of them destroy themselves for some reason, especially if created through non-standard means.
/obj/random/proc/Random_SafeDestroy(var/recursion_level)
set waitfor = FALSE
sleep(30)
qdel(src)
if(src && recursion_level < 5)
Random_SafeDestroy(recursion_level + 1)
// this function should return a specific item to spawn
/obj/random/proc/item_to_spawn()

View File

@@ -70,6 +70,11 @@
id = "Captain's spare id"
item_path = /obj/item/weapon/card/id/gold/captain/spare
/obj/random_multi/single_item/hand_tele
name = "Multi Point - Hand Teleporter"
id = "hand tele"
item_path = /obj/item/weapon/hand_tele
/obj/random_multi/single_item/sfr_headset
name = "Multi Point - headset"
id = "SFR headset"

View File

@@ -384,7 +384,7 @@
if(!opened)
icon_state = icon_closed
if(sealed)
overlays += "sealed"
overlays += "welded"
else
icon_state = icon_opened

View File

@@ -298,6 +298,14 @@
/obj/structure/flora/sif
icon = 'icons/obj/flora/sifflora.dmi'
/obj/structure/flora/sif/attack_hand(mob/user)
if (user.a_intent == I_HURT)
if(do_after(user, 5 SECONDS))
user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
qdel(src)
else
user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
/datum/category_item/catalogue/flora/subterranean_bulbs
name = "Sivian Flora - Subterranean Bulbs"
desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
@@ -340,4 +348,4 @@
/obj/structure/flora/sif/eyes/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
. = ..()
. = ..()

View File

@@ -41,6 +41,9 @@
set_flooring(get_flooring_data(floortype))
else
footstep_sounds = base_footstep_sounds
if(can_dirty)
if(prob(2))
new /obj/effect/decal/cleanable/dirt(src) //5% chance to start with dirt on a floor tile- give the janitor something to do
/turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring)
make_plating(defer_icon_update = 1)

View File

@@ -29,7 +29,7 @@ var/list/grass_types = list(
name = "growth"
icon_state = "grass_sif"
edge_blending_priority = 4
grass_chance = 0
grass_chance = 5
var/tree_chance = 2
grass_types = list(

View File

@@ -6,6 +6,7 @@ var/list/blob_cores = list()
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
density = TRUE //bandaid fix for PolarisSS13/6173
max_integrity = 150
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed

View File

@@ -546,3 +546,7 @@ Drinks Data
/datum/reagent/drink/eggnog
glass_icon_state = "eggnog"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/cider
glass_icon_state = "ciderglass"
glass_center_of_mass = list("x"=16, "y"=8)

View File

@@ -520,6 +520,17 @@
. = ..()
reagents.add_reagent("beer", 30)
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider
name = "Crisp's Cider"
desc = "Fermented apples never tasted this good."
icon_state = "cider"
center_of_mass = list("x"=16, "y"=12)
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider/Initialize()
. = ..()
reagents.add_reagent("cider", 30)
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale
name = "\improper Magm-Ale"
desc = "A true dorf's drink of choice."

View File

@@ -6,6 +6,7 @@
var/gas_type // Chosen gas to release
// Exclude these types and sub-types from targeting eligibilty
var/list/area/excluded = list(
/area/submap,
/area/shuttle,
/area/crew_quarters,
/area/holodeck,

View File

@@ -3,7 +3,9 @@
departments = list(ROLE_ENGINEERING, ROLE_MEDICAL)
chaotic = 10
var/obj/machinery/door/airlock/chosen_door
var/area/target_area
var/list/area/excluded = list(
/area/submap,
/area/shuttle,
/area/crew_quarters
)
@@ -19,9 +21,9 @@
//try 10 times
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
target_area = pick(grand_list_of_areas)
var/list/obj/machinery/door/airlock/target_doors = list()
for(var/obj/machinery/door/airlock/target_door in A.contents)
for(var/obj/machinery/door/airlock/target_door in target_area.contents)
target_doors += target_door
target_doors = shuffle(target_doors)
@@ -34,11 +36,15 @@
..()
if(!chosen_door)
return
if(prob(33))
chosen_door.visible_message("<span class='danger'>\The [chosen_door]'s panel sparks!</span>")
command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert")
chosen_door.visible_message("<span class='danger'>\The [chosen_door]'s panel sparks!</span>")
chosen_door.set_safeties(0)
playsound(get_turf(chosen_door), 'sound/machines/buzz-sigh.ogg', 50, 1)
if(severity >= EVENT_LEVEL_MODERATE)
chosen_door.electrify(-1)
spawn(rand(10 SECONDS, 2 MINUTES))
if(chosen_door && chosen_door.arePowerSystemsOn() && prob(25 + 25 * severity))
command_announcement.Announce("Overload has been localized to \the [target_area].", "Electrical Alert")
if(severity >= EVENT_LEVEL_MAJOR) // New Major effect. Hydraulic boom.
spawn()

View File

@@ -0,0 +1,33 @@
/datum/gm_action/planet_weather_shift
name = "sudden weather shift"
enabled = TRUE
departments = list(ROLE_EVERYONE)
reusable = TRUE
var/datum/planet/target_planet
var/list/banned_weathers = list(
/datum/weather/sif/ash_storm,
/datum/weather/sif/emberfall,
/datum/weather/sif/blood_moon,
/datum/weather/sif/fallout)
var/list/possible_weathers = list()
/datum/gm_action/planet_weather_shift/set_up()
if(!target_planet || isnull(target_planet))
target_planet = pick(SSplanets.planets)
possible_weathers |= target_planet.weather_holder.allowed_weather_types
possible_weathers -= banned_weathers
return
/datum/gm_action/planet_weather_shift/get_weight()
return max(0, -15 + (metric.count_all_outdoor_mobs() * 20))
/datum/gm_action/planet_weather_shift/start()
..()
var/new_weather = pick(possible_weathers)
target_planet.weather_holder.change_weather(new_weather)
/datum/gm_action/planet_weather_shift/announce()
spawn(rand(3 SECONDS, 2 MINUTES))
command_announcement.Announce("Local weather patterns on [target_planet.name] suggest that a sudden atmospheric fluctuation has occurred. All groundside personnel should be wary of rapidly deteriorating conditions.", "Weather Alert")
return

View File

@@ -10,4 +10,4 @@
break
/datum/gm_action/spontaneous_appendicitis/get_weight()
return 5 + (metric.count_people_in_department(ROLE_MEDICAL) * 10)
return max(0, -5 + (metric.count_people_in_department(ROLE_MEDICAL) * 10))

View File

@@ -14,7 +14,7 @@
can_be_asked_input = 1
inputs = list()
outputs = list()
activators = list("on pressed" = IC_PINTYPE_PULSE_IN)
activators = list("on pressed" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
@@ -31,7 +31,7 @@
can_be_asked_input = 1
inputs = list()
outputs = list("on" = IC_PINTYPE_BOOLEAN)
activators = list("on toggle" = IC_PINTYPE_PULSE_IN)
activators = list("on toggle" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/input/toggle_button/ask_for_input(mob/user) // Ditto.
@@ -48,7 +48,7 @@
can_be_asked_input = 1
inputs = list()
outputs = list("number entered" = IC_PINTYPE_NUMBER)
activators = list("on entered" = IC_PINTYPE_PULSE_IN)
activators = list("on entered" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 4
@@ -67,7 +67,7 @@
can_be_asked_input = 1
inputs = list()
outputs = list("string entered" = IC_PINTYPE_STRING)
activators = list("on entered" = IC_PINTYPE_PULSE_IN)
activators = list("on entered" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 4
@@ -86,7 +86,7 @@
can_be_asked_input = 1
inputs = list()
outputs = list("color entered" = IC_PINTYPE_COLOR)
activators = list("on entered" = IC_PINTYPE_PULSE_IN)
activators = list("on entered" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 4

View File

@@ -99,9 +99,9 @@
/datum/lighting_corner/proc/update_overlays()
// Cache these values a head of time so 4 individual lighting overlays don't all calculate them individually.
var/lum_r = src.lum_r
var/lum_g = src.lum_g
var/lum_b = src.lum_b
var/lum_r = src.lum_r > 0 ? LIGHTING_MULT_FACTOR * sqrt(src.lum_r) : src.lum_r
var/lum_g = src.lum_g > 0 ? LIGHTING_MULT_FACTOR * sqrt(src.lum_g) : src.lum_g
var/lum_b = src.lum_b > 0 ? LIGHTING_MULT_FACTOR * sqrt(src.lum_b) : src.lum_b
var/mx = max(lum_r, lum_g, lum_b) // Scale it so 1 is the strongest lum, if it is above 1.
. = 1 // factor
if (mx > 1)

View File

@@ -189,7 +189,7 @@
);
// This is the define used to calculate falloff.
#define LUM_FALLOFF(C, T)(1 - CLAMP01(sqrt((C.x - T.x) ** 2 +(C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range)))
#define LUM_FALLOFF(C, T)(1 - CLAMP01(((C.x - T.x) ** 2 +(C.y - T.y) ** 2 + LIGHTING_HEIGHT) ** 0.6 / max(1, light_range)))
/datum/light_source/proc/apply_lum()
var/static/update_gen = 1

View File

@@ -80,3 +80,14 @@
num++
if(num)
. = round(. / num, 0.1)
/datum/metric/proc/assess_all_outdoor_mobs()
. = 0
var/num = 0
for(var/mob/living/L in player_list)
var/turf/T = get_turf(L)
if(istype(T) && !istype(T, /turf/space) && T.outdoors)
. += assess_player_activity(L)
num++
if(num)
. = round(. / num, 0.1)

View File

@@ -0,0 +1,21 @@
/*
* Procs for counting active players in different situations. Returns the number of active players within the given cutoff.
*/
/datum/metric/proc/count_all_outdoor_mobs(var/cutoff = 75)
var/num = 0
for(var/mob/living/L in player_list)
var/turf/T = get_turf(L)
if(istype(T) && !istype(T, /turf/space) && T.outdoors)
if(assess_player_activity(L) >= cutoff)
num++
return num
/datum/metric/proc/count_all_space_mobs(var/cutoff = 75)
var/num = 0
for(var/mob/living/L in player_list)
var/turf/T = get_turf(L)
if(istype(T, /turf/space))
if(assess_player_activity(L) >= cutoff)
num++
return num

View File

@@ -69,4 +69,4 @@
for(var/mob/M in player_list)
if(guess_department(M) != department) // Ignore people outside the department we're counting.
continue
. += 1
. += 1

View File

@@ -33,7 +33,7 @@
if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
if(!say_understands(speaker,language))
if(language)
message = language.scramble(message)
message = language.scramble(message, languages)
else
message = stars(message)
@@ -165,7 +165,7 @@
if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
if(!say_understands(speaker,language))
if(language)
message = language.scramble(message)
message = language.scramble(message, languages)
else
message = stars(message)

View File

@@ -32,6 +32,7 @@
syllables = list(
"vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish",
"ar","at","on","ee","east","ma","da", "rim")
partial_understanding = list(LANGUAGE_SKRELLIAN = 30, LANGUAGE_SOL_COMMON = 30)
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
/datum/language/common/get_spoken_verb(var/msg_end)
@@ -64,6 +65,7 @@
colour = "terminus"
key = "4"
flags = WHITELISTED
partial_understanding = list(LANGUAGE_SOL_COMMON = 20)
syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl",
"sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
"uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
@@ -76,6 +78,7 @@
colour = "rough"
key = "3"
space_chance = 45
partial_understanding = list(LANGUAGE_GALCOM = 10, LANGUAGE_TRADEBAND = 20, LANGUAGE_SOL_COMMON = 20)
syllables = list (
"gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra",
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",

View File

@@ -19,6 +19,7 @@
var/list/syllables // Used when scrambling text for a non-speaker.
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string
var/machine_understands = 1 // Whether machines can parse and understand this language
var/list/partial_understanding // List of languages that can /somehwat/ understand it, format is: name = chance of understanding a word
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
@@ -41,8 +42,42 @@
/datum/language
var/list/scramble_cache = list()
/datum/language/proc/scramble(var/input)
/datum/language/proc/scramble(var/input, var/list/known_languages)
var/understand_chance = 0
for(var/datum/language/L in known_languages)
if(partial_understanding && partial_understanding[L.name])
understand_chance += partial_understanding[L.name]
if(L.partial_understanding && L.partial_understanding[name])
understand_chance += L.partial_understanding[name] * 0.5
var/scrambled_text = ""
var/list/words = splittext(input, " ")
for(var/w in words)
if(prob(understand_chance))
scrambled_text += " [w] "
else
var/nword = scramble_word(w)
var/ending = copytext(scrambled_text, length(scrambled_text)-1)
if(findtext(ending,"."))
nword = capitalize(nword)
else if(findtext(ending,"!"))
nword = capitalize(nword)
else if(findtext(ending,"?"))
nword = capitalize(nword)
scrambled_text += nword
scrambled_text = replacetext(scrambled_text," "," ")
scrambled_text = capitalize(scrambled_text)
scrambled_text = trim(scrambled_text)
var/ending = copytext(scrambled_text, length(scrambled_text))
if(ending == ".")
scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1)
var/input_ending = copytext(input, length(input))
if(input_ending in list("!","?","."))
scrambled_text += input_ending
return scrambled_text
/datum/language/proc/scramble_word(var/input)
if(!syllables || !syllables.len)
return stars(input)
@@ -55,7 +90,7 @@
var/input_size = length(input)
var/scrambled_text = ""
var/capitalize = 1
var/capitalize = 0
while(length(scrambled_text) < input_size)
var/next = pick(syllables)
@@ -70,14 +105,6 @@
else if(chance > 5 && chance <= space_chance)
scrambled_text += " "
scrambled_text = trim(scrambled_text)
var/ending = copytext(scrambled_text, length(scrambled_text))
if(ending == ".")
scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1)
var/input_ending = copytext(input, input_size)
if(input_ending in list("!","?","."))
scrambled_text += input_ending
// Add it to cache, cutting old entries if the list is too long
scramble_cache[input] = scrambled_text
if(scramble_cache.len > SCRAMBLE_CACHE_LEN)

View File

@@ -5,24 +5,28 @@
ask_verb = "chimpers"
exclaim_verb = "screeches"
key = "6"
syllables = list("ook","eek")
machine_understands = 0
/datum/language/skrell/monkey
name = "Neaera"
desc = "Squik squik squik."
key = "8"
syllables = list("hiss","gronk")
machine_understands = 0
/datum/language/unathi/monkey
name = "Stok"
desc = "Hiss hiss hiss."
key = "7"
syllables = list("squick","croak")
machine_understands = 0
/datum/language/tajaran/monkey
name = "Farwa"
desc = "Meow meow meow."
key = "9"
syllables = list("meow","mew")
machine_understands = 0
/datum/language/corgi

View File

@@ -6,9 +6,9 @@
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
icon_rest = "cat2_rest"
icon_living = "[initial(icon_state)]"
icon_dead = "[initial(icon_state)]_dead"
icon_rest = "[initial(icon_state)]_rest"
investigates = 1
specific_targets = 1 //Only targets with Found()
@@ -161,9 +161,6 @@
gender = FEMALE
icon_state = "cat"
item_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
icon_rest = "cat_rest"
befriend_job = "Chief Medical Officer"
/mob/living/simple_animal/cat/kitten
@@ -188,9 +185,6 @@
gender = MALE
icon_state = "cat3"
item_state = "cat3"
icon_living = "cat3"
icon_dead = "cat3_dead"
icon_rest = "cat3_rest"
holder_type = /obj/item/weapon/holder/cat/fluff/bones
friend_name = "Erstatz Vryroxes"

View File

@@ -4,9 +4,6 @@
tt_desc = "E Felis silvestris catus"
icon_state = "cat2"
item_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
icon_rest = "cat2_rest"
movement_cooldown = 0.5 SECONDS
@@ -21,6 +18,14 @@
has_langs = list("Cat")
var/mob/living/friend = null // Our best pal, who we'll follow. Meow.
var/named = FALSE //have I been named yet?
/mob/living/simple_mob/animal/passive/cat/Initialize()
icon_living = "[initial(icon_state)]"
icon_dead = "[initial(icon_state)]_dead"
icon_rest = "[initial(icon_state)]_rest"
update_icon()
return ..()
/mob/living/simple_mob/animal/passive/cat/handle_special()
if(!stat && prob(2)) // spooky
@@ -90,17 +95,13 @@
gender = FEMALE
icon_state = "cat"
item_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
icon_rest = "cat_rest"
named = TRUE
/mob/living/simple_mob/animal/passive/cat/kitten
name = "kitten"
desc = "D'aaawwww"
desc = "D'aaawwww!"
icon_state = "kitten"
item_state = "kitten"
icon_living = "kitten"
icon_dead = "kitten_dead"
gender = NEUTER
/mob/living/simple_mob/animal/passive/cat/kitten/Initialize()
@@ -108,6 +109,10 @@
gender = pick(MALE, FEMALE)
return ..()
/mob/living/simple_mob/animal/passive/cat/black
icon_state = "cat"
item_state = "cat"
// Leaving this here for now.
/obj/item/weapon/holder/cat/fluff/bones
name = "Bones"
@@ -121,12 +126,9 @@
gender = MALE
icon_state = "cat3"
item_state = "cat3"
icon_living = "cat3"
icon_dead = "cat3_dead"
icon_rest = "cat3_rest"
named = TRUE
holder_type = /obj/item/weapon/holder/cat/fluff/bones
/datum/say_list/cat
speak = list("Meow!","Esp!","Purr!","HSSSSS")
emote_hear = list("meows","mews")
@@ -134,3 +136,34 @@
say_maybe_target = list("Meow?","Mew?","Mao?")
say_got_target = list("MEOW!","HSSSS!","REEER!")
/mob/living/simple_mob/animal/passive/cat/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
if(named)
to_chat(user, "<span class='notice'>\the [name] already has a name!</span>")
else
var/tmp_name = sanitizeSafe(input(user, "Give \the [name] a name", "Name"), MAX_NAME_LEN)
if(length(tmp_name) > 50)
to_chat(user, "<span class='notice'>The name can be at most 50 characters long.</span>")
else
to_chat(user, "<span class='notice'>You name \the [name]. Meow!</span>")
name = tmp_name
named = TRUE
else
..()
/obj/item/weapon/cat_box
name = "faintly purring box"
desc = "This box is purring faintly. You're pretty sure there's a cat inside it."
icon = 'icons/obj/storage.dmi'
icon_state = "box"
var/cattype = /mob/living/simple_mob/animal/passive/cat
/obj/item/weapon/cat_box/attack_self(var/mob/user)
var/turf/catturf = get_turf(src)
to_chat(user, "<span class='notice'>You peek into \the [name]-- and a cat jumps out!</span>")
new cattype(catturf)
new /obj/item/stack/material/cardboard(catturf) //if i fits i sits
qdel(src)
/obj/item/weapon/cat_box/black
cattype = /mob/living/simple_mob/animal/passive/cat/black

View File

@@ -314,8 +314,10 @@
switch(mob.incorporeal_move)
if(1)
var/turf/T = get_step(mob, direct)
if(!T)
return
if(mob.check_holy(T))
mob << "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>"
to_chat(mob, "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>")
return
else
mob.forceMove(get_step(mob, direct))

View File

@@ -0,0 +1,92 @@
/*
* Augments. This file contains the base, and organic-targeting augments.
*/
/obj/item/organ/internal/augment
name = "augment"
icon_state = "cell_bay"
parent_organ = BP_TORSO
organ_verbs = list() // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for deployable things.
var/integrated_object_type // Object type the organ will spawn.
/obj/item/organ/internal/augment/Initialize()
..()
if(integrated_object_type)
integrated_object = new integrated_object_type(src)
integrated_object.canremove = FALSE
/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE)
if(removed && integrated_object && integrated_object.loc != src)
if(isliving(integrated_object.loc))
var/mob/living/L = integrated_object.loc
L.drop_from_inventory(integrated_object)
integrated_object.forceMove(src)
..(removed)
// The base organic-targeting augment.
/obj/item/organ/internal/augment/bioaugment
name = "bioaugmenting implant"
robotic = ORGAN_ROBOT
target_parent_classes = list(ORGAN_FLESH)
// Jensen Shades. Your vision can be augmented.
/obj/item/organ/internal/augment/bioaugment/thermalshades
name = "integrated thermolensing implant"
desc = "A miniscule implant that houses a pair of thermolensed sunglasses. Don't ask how they deploy, you don't want to know."
icon_state = "augment_shades"
dead_icon = "augment_shades_dead"
w_class = ITEMSIZE_TINY
organ_tag = O_AUG_TSHADE
parent_organ = BP_HEAD
organ_verbs = list(/mob/living/carbon/human/proc/toggle_shades)
integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades
/mob/living/carbon/human/proc/toggle_shades()
set name = "Toggle Integrated Thermoshades"
set desc = "Toggle your flash-proof, thermal-integrated sunglasses."
set category = "Augments"
var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_TSHADE]
if(glasses)
if(aug && aug.integrated_object == glasses)
drop_from_inventory(glasses)
aug.integrated_object.forceMove(aug)
if(!glasses)
to_chat(src, "<span class='alien'>Your [aug.integrated_object] retract into your skull.</span>")
else if(!istype(glasses, /obj/item/clothing/glasses/hud/security/jensenshades))
to_chat(src, "<span class='notice'>\The [glasses] block your shades from deploying.</span>")
else if(istype(glasses, /obj/item/clothing/glasses/hud/security/jensenshades))
var/obj/item/G = glasses
if(G.canremove)
to_chat(src, "<span class='notice'>\The [G] are not your integrated shades.</span>")
else
drop_from_inventory(G)
to_chat(src, "<span class='notice'>\The [G] retract into your skull.</span>")
qdel(G)
else
if(aug && aug.integrated_object)
to_chat(src, "<span class='alien'>Your [aug.integrated_object] deploy.</span>")
equip_to_slot(aug.integrated_object, slot_glasses, 0, 1)
if(!glasses || glasses != aug.integrated_object)
aug.integrated_object.forceMove(aug)
else
var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src))
equip_to_slot(J, slot_glasses, 1, 1)
to_chat(src, "<span class='notice'>Your [aug.integrated_object] deploy.</span>")

View File

@@ -36,7 +36,10 @@ var/list/organ_cache = list()
var/list/will_assist_languages = list()
var/list/datum/language/assists_languages = list()
var/list/organ_verbs // Verbs added by the organ when present in the body.
// Organ verb vars.
var/list/organ_verbs // Verbs added by the organ when present in the body.
var/list/target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
var/forgiving_class = TRUE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
/obj/item/organ/Destroy()
@@ -429,12 +432,12 @@ var/list/organ_cache = list()
all_organs |= owner.internal_organs
for(var/obj/item/organ/O in all_organs)
if(!(O.status & ORGAN_DEAD) && O.organ_verbs)
if(!(O.status & ORGAN_DEAD) && O.organ_verbs && O.check_verb_compatability())
for(var/verb_type in O.organ_verbs)
if(verb_type in organ_verbs)
save_verbs |= verb_type
if(!removed && organ_verbs)
if(!removed && organ_verbs && check_verb_compatability())
for(var/verb_path in organ_verbs)
owner.verbs |= verb_path
else if(organ_verbs)
@@ -445,3 +448,32 @@ var/list/organ_cache = list()
/obj/item/organ/proc/handle_organ_proc_special() // Called when processed.
return
/obj/item/organ/proc/check_verb_compatability() // Used for determining if an organ should give or remove its verbs. I.E., FBP part in a human, no verbs. If true, keep or add.
if(owner)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
var/obj/item/organ/O = H.get_organ(parent_organ)
if(forgiving_class)
if(O.robotic <= ORGAN_ASSISTED && robotic <= ORGAN_LIFELIKE) // Parent is organic or assisted, we are at most synthetic.
return TRUE
if(O.robotic >= ORGAN_ROBOT && robotic >= ORGAN_ASSISTED) // Parent is synthetic, and we are biosynthetic at least.
return TRUE
if(!target_parent_classes || !target_parent_classes.len) // Default checks, if we're not looking for a Specific type.
if(O.robotic == robotic) // Same thing, we're fine.
return TRUE
if(O.robotic < ORGAN_ROBOT && robotic < ORGAN_ROBOT)
return TRUE
if(O.robotic > ORGAN_ASSISTED && robotic > ORGAN_ASSISTED)
return TRUE
else
if(O.robotic in target_parent_classes)
return TRUE
return FALSE

View File

@@ -129,7 +129,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/grayson/grayson_main.dmi'
unavailable_to_build = 1
monitor_styles = "blank=grayson_off;\
red=grayson_red;\
green=grayson_green;\
blue=grayson_blue;\
rgb=grayson_rgb"
/datum/robolimb/grayson_alt1
@@ -177,7 +179,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
desc = "This rather thick limb has a militaristic green plating."
icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt2.dmi'
unavailable_to_build = 1
monitor_styles = "red=athena_red;\
blank=athena_off"
/datum/robolimb/hephaestus_monitor
company = "Hephaestus Monitor"
@@ -266,7 +269,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt2.dmi'
unavailable_to_build = 1
monitor_styles = "blank=xion_off;\
red=xion_red;\
green=xion_green;\
blue=xion_blue;\
rgb=xion_rgb"
/datum/robolimb/xion_alt3

View File

@@ -9,6 +9,14 @@
#define LIGHT_BROKEN 2
#define LIGHT_BURNED 3
#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb
#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range
var/global/list/light_type_cache = list()
/proc/get_light_type_instance(var/light_type)
. = light_type_cache[light_type]
if(!.)
. = new light_type
light_type_cache[light_type] = .
/obj/machinery/light_construct
name = "light fixture frame"
@@ -19,16 +27,26 @@
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
var/stage = 1
var/fixture_type = "tube"
var/fixture_type = /obj/machinery/light
var/sheets_refunded = 2
var/obj/machinery/light/newlight = null
/obj/machinery/light_construct/New()
..()
if (fixture_type == "bulb")
icon_state = "bulb-construct-stage1"
if (fixture_type == "flamp")
icon_state = "flamp-construct-stage1"
/obj/machinery/light_construct/New(atom/newloc, obj/machinery/light/fixture = null)
..(newloc)
if(fixture)
fixture_type = fixture.type
fixture.transfer_fingerprints_to(src)
set_dir(fixture.dir)
stage = 2
update_icon()
/obj/machinery/light_construct/update_icon()
switch(stage)
if(1)
icon_state = "tube-construct-stage1"
if(2)
icon_state = "tube-construct-stage2"
if(3)
icon_state = "tube-empty"
/obj/machinery/light_construct/examine(mob/user)
if(!..(user, 2))
@@ -36,21 +54,18 @@
switch(src.stage)
if(1)
user << "It's an empty frame."
return
to_chat(user, "It's an empty frame.")
if(2)
user << "It's wired."
return
to_chat(user, "It's wired.")
if(3)
user << "The casing is closed."
return
to_chat(user, "The casing is closed.")
/obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if (W.is_wrench())
if (src.stage == 1)
playsound(src, W.usesound, 75, 1)
usr << "You begin deconstructing [src]."
to_chat(usr, "You begin deconstructing [src].")
if (!do_after(usr, 30 * W.toolspeed))
return
new /obj/item/stack/material/steel( get_turf(src.loc), sheets_refunded )
@@ -59,23 +74,17 @@
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
qdel(src)
if (src.stage == 2)
usr << "You have to remove the wires first."
to_chat(usr, "You have to remove the wires first.")
return
if (src.stage == 3)
usr << "You have to unscrew the case first."
to_chat(usr, "You have to unscrew the case first.")
return
if(W.is_wirecutter())
if (src.stage != 2) return
src.stage = 1
switch(fixture_type)
if ("tube")
src.icon_state = "tube-construct-stage1"
if("bulb")
src.icon_state = "bulb-construct-stage1"
if("flamp")
src.icon_state = "flamp-construct-stage1"
src.update_icon()
new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red")
user.visible_message("[user.name] removes the wiring from [src].", \
"You remove the wiring from [src].", "You hear a noise.")
@@ -86,42 +95,22 @@
if (src.stage != 1) return
var/obj/item/stack/cable_coil/coil = W
if (coil.use(1))
switch(fixture_type)
if ("tube")
src.icon_state = "tube-construct-stage2"
if("bulb")
src.icon_state = "bulb-construct-stage2"
if("flamp")
src.icon_state = "flamp-construct-stage2"
src.stage = 2
src.update_icon()
user.visible_message("[user.name] adds wires to [src].", \
"You add wires to [src].")
return
if(W.is_screwdriver())
if (src.stage == 2)
switch(fixture_type)
if ("tube")
src.icon_state = "tube-empty"
if("bulb")
src.icon_state = "bulb-empty"
if("flamp")
src.icon_state = "flamp-empty"
src.stage = 3
src.update_icon()
user.visible_message("[user.name] closes [src]'s casing.", \
"You close [src]'s casing.", "You hear a noise.")
playsound(src, W.usesound, 75, 1)
switch(fixture_type)
if("tube")
newlight = new /obj/machinery/light/built(src.loc)
if ("bulb")
newlight = new /obj/machinery/light/small/built(src.loc)
if ("flamp")
newlight = new /obj/machinery/light/flamp/built(src.loc)
newlight.dir = src.dir
var/obj/machinery/light/newlight = new fixture_type(src.loc, src)
newlight.set_dir(src.dir)
src.transfer_fingerprints_to(newlight)
qdel(src)
return
@@ -134,9 +123,18 @@
icon_state = "bulb-construct-stage1"
anchored = 1
stage = 1
fixture_type = "bulb"
fixture_type = /obj/machinery/light/small
sheets_refunded = 1
/obj/machinery/light_construct/small/update_icon()
switch(stage)
if(1)
icon_state = "bulb-construct-stage1"
if(2)
icon_state = "bulb-construct-stage2"
if(3)
icon_state = "bulb-empty"
/obj/machinery/light_construct/flamp
name = "floor light fixture frame"
desc = "A floor light fixture under construction."
@@ -146,9 +144,18 @@
plane = OBJ_PLANE
layer = OBJ_LAYER
stage = 1
fixture_type = "flamp"
fixture_type = /obj/machinery/light/flamp
sheets_refunded = 2
/obj/machinery/light_construct/flamp/update_icon()
switch(stage)
if(1)
icon_state = "flamp-construct-stage1"
if(2)
icon_state = "flamp-construct-stage2"
if(3)
icon_state = "flamp-empty"
// the standard tube light fixture
/obj/machinery/light
name = "light fixture"
@@ -164,13 +171,13 @@
active_power_usage = 10 // Previously 20.
power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list
var/on = 0 // 1 if on, 0 if off
var/brightness_range = 8 // luminosity when on, also used in power calculation
var/brightness_power = 0.8
var/brightness_color = LIGHT_COLOR_INCANDESCENT_TUBE
var/brightness_range
var/brightness_power
var/brightness_color
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
var/flickering = 0
var/light_type = /obj/item/weapon/light/tube // the type of light item
var/fitting = "tube"
var/construct_type = /obj/machinery/light_construct
var/switchcount = 0 // count of number of times switched on/off
// this is used to calc the probability the light burns out
@@ -186,11 +193,9 @@
/obj/machinery/light/small
icon_state = "bulb1"
base_state = "bulb"
fitting = "bulb"
brightness_range = 4
brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
construct_type = /obj/machinery/light_construct/small
/obj/machinery/light/small/flicker
auto_flicker = TRUE
@@ -198,13 +203,11 @@
/obj/machinery/light/flamp
icon_state = "flamp1"
base_state = "flamp"
fitting = "bulb"
brightness_range = 5
plane = OBJ_PLANE
layer = OBJ_LAYER
brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
desc = "A floor lamp."
light_type = /obj/item/weapon/light/bulb
construct_type = /obj/machinery/light_construct/flamp
var/lamp_shade = 1
/obj/machinery/light/flamp/flicker
@@ -212,8 +215,7 @@
/obj/machinery/light/small/emergency
brightness_range = 4
brightness_color = "#da0205"
light_type = /obj/item/weapon/light/bulb/red
/obj/machinery/light/small/emergency/flicker
auto_flicker = TRUE
@@ -221,47 +223,28 @@
/obj/machinery/light/spot
name = "spotlight"
fitting = "large tube"
light_type = /obj/item/weapon/light/tube/large
brightness_range = 12
brightness_power = 0.9
/obj/machinery/light/spot/flicker
auto_flicker = TRUE
/obj/machinery/light/built/New()
status = LIGHT_EMPTY
update(0)
..()
/obj/machinery/light/small/built/New()
status = LIGHT_EMPTY
update(0)
..()
/obj/machinery/light/flamp/built/New()
status = LIGHT_EMPTY
lamp_shade = 0
update(0)
..()
// create a new lighting fixture
/obj/machinery/light/New()
..()
/obj/machinery/light/New(atom/newloc, obj/machinery/light_construct/construct = null)
..(newloc)
spawn(2)
on = has_power()
if(construct)
status = LIGHT_EMPTY
construct_type = construct.type
construct.transfer_fingerprints_to(src)
set_dir(construct.dir)
else
var/obj/item/weapon/light/L = get_light_type_instance(light_type)
update_from_bulb(L)
if(prob(L.broken_chance))
broken(1)
switch(fitting)
if("tube")
if(prob(2))
broken(1)
if("bulb")
if(prob(5))
broken(1)
spawn(1)
update(0)
on = powered()
update(0)
/obj/machinery/light/Destroy()
var/area/A = get_area(src)
@@ -307,7 +290,7 @@
..()
// update the icon_state and luminosity of the light depending on its state
// update lighting
/obj/machinery/light/proc/update(var/trigger = 1)
update_icon()
if(on)
@@ -334,14 +317,14 @@
use_power = 1
set_light(0)
active_power_usage = light_range * light_power
active_power_usage = ((light_range * light_power) * LIGHTING_POWER_FACTOR)
/obj/machinery/light/attack_generic(var/mob/user, var/damage)
if(!damage)
return
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
user << "That object is useless to you."
to_chat(user, "That object is useless to you.")
return
if(!(status == LIGHT_OK||status == LIGHT_BURNED))
return
@@ -361,20 +344,52 @@
// examine verb
/obj/machinery/light/examine(mob/user)
var/fitting = get_fitting_name()
switch(status)
if(LIGHT_OK)
user << "[desc] It is turned [on? "on" : "off"]."
to_chat(user, "[desc] It is turned [on? "on" : "off"].")
if(LIGHT_EMPTY)
user << "[desc] The [fitting] has been removed."
to_chat(user, "[desc] The [fitting] has been removed.")
if(LIGHT_BURNED)
user << "[desc] The [fitting] is burnt out."
to_chat(user, "[desc] The [fitting] is burnt out.")
if(LIGHT_BROKEN)
user << "[desc] The [fitting] has been smashed."
to_chat(user, "[desc] The [fitting] has been smashed.")
/obj/machinery/light/proc/get_fitting_name()
var/obj/item/weapon/light/L = light_type
return initial(L.name)
/obj/machinery/light/proc/update_from_bulb(obj/item/weapon/light/L)
status = L.status
switchcount = L.switchcount
rigged = L.rigged
brightness_range = L.brightness_range
brightness_power = L.brightness_power
brightness_color = L.brightness_color
// attack with item - insert light (if right type), otherwise try to break the light
/obj/machinery/light/proc/insert_bulb(obj/item/weapon/light/L)
update_from_bulb(L)
qdel(L)
on = powered()
update()
if(on && rigged)
log_admin("LOG: Rigged light explosion, last touched by [fingerprintslast]")
message_admins("LOG: Rigged light explosion, last touched by [fingerprintslast]")
explode()
/obj/machinery/light/proc/remove_bulb()
. = new light_type(src.loc, src)
switchcount = 0
status = LIGHT_EMPTY
update()
/obj/machinery/light/attackby(obj/item/W, mob/user)
//Light replacer code
@@ -388,34 +403,15 @@
// attempt to insert light
if(istype(W, /obj/item/weapon/light))
if(status != LIGHT_EMPTY)
user << "There is a [fitting] already inserted."
to_chat(user, "There is a [get_fitting_name()] already inserted.")
return
if(!istype(W, light_type))
to_chat(user, "This type of light requires a [get_fitting_name()].")
return
else
src.add_fingerprint(user)
var/obj/item/weapon/light/L = W
if(istype(L, light_type))
status = L.status
user << "You insert the [L.name]."
switchcount = L.switchcount
rigged = L.rigged
brightness_range = L.brightness_range
brightness_power = L.brightness_power
brightness_color = L.brightness_color
on = has_power()
update()
user.drop_item() //drop the item to update overlays and such
qdel(L)
if(on && rigged)
log_admin("LOG: Rigged light explosion, last touched by [fingerprintslast]")
message_admins("LOG: Rigged light explosion, last touched by [fingerprintslast]")
explode()
else
user << "This type of light requires a [fitting]."
return
to_chat(user, "You insert [W].")
insert_bulb(W)
src.add_fingerprint(user)
// attempt to break the light
//If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N
@@ -425,7 +421,7 @@
if(prob(1+W.force * 5))
user << "You hit the light, and it smashes!"
to_chat(user, "You hit the light, and it smashes!")
for(var/mob/M in viewers(src))
if(M == user)
continue
@@ -437,7 +433,7 @@
broken()
else
user << "You hit the light!"
to_chat(user, "You hit the light!")
// attempt to stick weapon into light socket
else if(status == LIGHT_EMPTY)
@@ -445,29 +441,11 @@
playsound(src, W.usesound, 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
var/obj/machinery/light_construct/newlight = null
switch(fitting)
if("tube")
newlight = new /obj/machinery/light_construct(src.loc)
newlight.icon_state = "tube-construct-stage2"
if("bulb")
newlight = new /obj/machinery/light_construct/small(src.loc)
newlight.icon_state = "bulb-construct-stage2"
if("flamp")
newlight = new /obj/machinery/light_construct/flamp(src.loc)
newlight.icon_state = "flamp-construct-stage2"
newlight.dir = src.dir
newlight.stage = 2
newlight.fingerprints = src.fingerprints
newlight.fingerprintshidden = src.fingerprintshidden
newlight.fingerprintslast = src.fingerprintslast
new construct_type(src.loc, src)
qdel(src)
return
user << "You stick \the [W] into the light socket!"
to_chat(user, "You stick \the [W] into the light socket!")
if(has_power() && !(W.flags & NOCONDUCT))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
@@ -480,7 +458,7 @@
if(W.is_wrench())
anchored = !anchored
playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
to_chat(user, "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>")
if(!lamp_shade)
if(istype(W, /obj/item/weapon/lampshade))
@@ -545,7 +523,7 @@
add_fingerprint(user)
if(status == LIGHT_EMPTY)
user << "There is no [fitting] in this light."
to_chat(user, "There is no [get_fitting_name()] in this light.")
return
if(istype(user,/mob/living/carbon/human))
@@ -574,39 +552,22 @@
prot = 1
if(prot > 0 || (COLD_RESISTANCE in user.mutations))
user << "You remove the light [fitting]"
to_chat(user, "You remove the light [get_fitting_name()]")
else if(TK in user.mutations)
user << "You telekinetically remove the light [fitting]."
to_chat(user, "You telekinetically remove the light [get_fitting_name()].")
else
user << "You try to remove the light [fitting], but it's too hot and you don't want to burn your hand."
to_chat(user, "You try to remove the light [get_fitting_name()], but it's too hot and you don't want to burn your hand.")
return // if burned, don't remove the light
else
user << "You remove the light [fitting]."
to_chat(user, "You remove the light [get_fitting_name()].")
// create a light tube/bulb item and put it in the user's hand
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
switchcount = 0
L.update()
L.add_fingerprint(user)
user.put_in_active_hand(L) //puts it in our active hand
status = LIGHT_EMPTY
update()
user.put_in_active_hand(remove_bulb()) //puts it in our active hand
/obj/machinery/light/flamp/attack_hand(mob/user)
if(lamp_shade)
if(status == LIGHT_EMPTY)
user << "There is no [fitting] in this light."
to_chat(user, "There is no [get_fitting_name()] in this light.")
return
if(on)
@@ -621,28 +582,11 @@
/obj/machinery/light/attack_tk(mob/user)
if(status == LIGHT_EMPTY)
user << "There is no [fitting] in this light."
to_chat(user, "There is no [get_fitting_name()] in this light.")
return
user << "You telekinetically remove the light [fitting]."
// create a light tube/bulb item and put it in the user's hand
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
switchcount = 0
L.update()
L.add_fingerprint(user)
L.loc = loc
status = LIGHT_EMPTY
update()
to_chat(user, "You telekinetically remove the light [get_fitting_name()].")
remove_bulb()
// break the light and make sparks if was on
@@ -689,13 +633,7 @@
// timed process
// use power
#define LIGHTING_POWER_FACTOR 20 //20W per unit luminosity
/obj/machinery/light/process()
if(on)
use_power(light_range * LIGHTING_POWER_FACTOR, LIGHT)
if(auto_flicker && !flickering)
if(check_for_player_proximity(src, radius = 12, ignore_ghosts = FALSE, ignore_afk = TRUE))
seton(TRUE) // Lights must be on to flicker.
@@ -703,7 +641,6 @@
else
seton(FALSE) // Otherwise keep it dark and spooky for when someone shows up.
// called when area power state changes
/obj/machinery/light/power_change()
spawn(10)
@@ -740,8 +677,10 @@
var/switchcount = 0 // number of times switched
matter = list(DEFAULT_WALL_MATERIAL = 60)
var/rigged = 0 // true if rigged to explode
var/broken_chance = 2
var/brightness_range = 2 //how much light it gives off
var/brightness_power = 0.8
var/brightness_power = 1
var/brightness_color = LIGHT_COLOR_INCANDESCENT_TUBE
/obj/item/weapon/light/tube
@@ -751,13 +690,14 @@
base_state = "ltube"
item_state = "c_tube"
matter = list("glass" = 100)
brightness_range = 8
brightness_range = 7 // luminosity when on, also used in power calculation
brightness_power = 6
/obj/item/weapon/light/tube/large
w_class = ITEMSIZE_SMALL
name = "large light tube"
brightness_range = 15
brightness_power = 0.9
brightness_power = 9
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -767,12 +707,18 @@
item_state = "contvapour"
matter = list("glass" = 100)
brightness_range = 5
brightness_power = 4
brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
/obj/item/weapon/light/throw_impact(atom/hit_atom)
..()
shatter()
/obj/item/weapon/light/bulb/red
brightness_range = 4
color = "#da0205"
brightness_color = "#da0205"
/obj/item/weapon/light/bulb/fire
name = "fire bulb"
desc = "A replacement fire bulb."
@@ -780,11 +726,9 @@
base_state = "fbulb"
item_state = "egg4"
matter = list("glass" = 100)
brightness_range = 5
// update the icon state and description of the light
/obj/item/weapon/light/proc/update()
/obj/item/weapon/light/update_icon()
switch(status)
if(LIGHT_OK)
icon_state = base_state
@@ -797,14 +741,19 @@
desc = "A broken [name]."
/obj/item/weapon/light/New()
/obj/item/weapon/light/New(atom/newloc, obj/machinery/light/fixture = null)
..()
switch(name)
if("light tube")
brightness_range = rand(6,9)
if("light bulb")
brightness_range = rand(4,6)
update()
if(fixture)
status = fixture.status
rigged = fixture.rigged
switchcount = fixture.switchcount
fixture.transfer_fingerprints_to(src)
//shouldn't be necessary to copy these unless someone varedits stuff, but just in case
brightness_range = fixture.brightness_range
brightness_power = fixture.brightness_power
brightness_color = fixture.brightness_color
update_icon()
// attack bulb/tube with object
@@ -814,7 +763,7 @@
if(istype(I, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = I
user << "You inject the solution into the [src]."
to_chat(user, "You inject the solution into the [src].")
if(S.reagents.has_reagent("phoron", 5))
@@ -848,7 +797,7 @@
force = 5
sharp = 1
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
update()
update_icon()
//Lamp Shade
/obj/item/weapon/lampshade

View File

@@ -99,6 +99,7 @@
return ..()
/obj/machinery/power/supermatter/Destroy()
STOP_PROCESSING(SSobj, src)
QDEL_NULL(soundloop)
return ..()
@@ -150,6 +151,8 @@
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
spawn(pull_time)
explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
spawn(5) //to allow the explosion to finish
new /obj/item/broken_sm(TS)
qdel(src)
return
@@ -452,3 +455,21 @@
/obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements
return
/obj/item/broken_sm
name = "shattered supermatter plinth"
desc = "The shattered remains of a supermatter shard plinth. It doesn't look safe to be around."
icon = 'icons/obj/engine.dmi'
icon_state = "darkmatter_broken"
/obj/item/broken_sm/New()
message_admins("Broken SM shard created at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
START_PROCESSING(SSobj, src)
return ..()
/obj/item/broken_sm/process()
radiation_repository.radiate(src, 50)
/obj/item/broken_sm/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()

View File

@@ -127,7 +127,7 @@
data["pillSprite"] = pillsprite
data["bottleSprite"] = bottlesprite
var/P[20] //how many pill sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png
var/P[24] //how many pill sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png
for(var/i = 1 to P.len)
P[i] = i
data["pillSpritesAmount"] = P
@@ -238,7 +238,7 @@
else
pill_cube = "pill"
var/name = sanitizeSafe(input(usr,"Name:","Name your [pill_cube]!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)") as null|text, MAX_NAME_LEN)
var/name = sanitizeSafe(input(usr,"Name:","Name your [pill_cube]!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as null|text, MAX_NAME_LEN)
if(!name) //Blank name (sanitized to nothing, or left empty) or cancel
return
@@ -257,6 +257,10 @@
else //If condi is on
P.icon_state = "bouilloncube"//Reskinned monkey cube
P.desc = "A dissolvable cube."
if(P.icon_state in list("pill1", "pill2", "pill3", "pill4")) // if using greyscale, take colour from reagent
P.color = reagents.get_color()
reagents.trans_to_obj(P,amount_per_pill)
if(src.loaded_pill_bottle)
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space)

View File

@@ -1934,6 +1934,7 @@
glass_name = "cider"
glass_desc = "The second most Irish drink."
glass_special = list(DRINK_FIZZ)
// Cocktails
@@ -3287,4 +3288,4 @@
strength = 9
glass_name = "fusionnaire"
glass_desc = "A relatively new cocktail, mostly served in the bars of NanoTrasen owned stations."
glass_desc = "A relatively new cocktail, mostly served in the bars of NanoTrasen owned stations."

View File

@@ -45,6 +45,7 @@
ale spawn_reagent = "ale"
mead spawn_reagent = "mead"
bitters spawn_reagent = "bitters"
cider spawn_reagent = "cider"
// Bar, soft
ice spawn_reagent = "ice"

View File

@@ -52,11 +52,11 @@
/obj/machinery/chemical_dispenser/bar_alc
dispense_reagents = list(
"lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", "tonic", "beer", "kahlua",
"whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "bitters"
"whiskey", "wine", "vodka", "cider", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "bitters"
)
/obj/machinery/chemical_dispenser/bar_coffee
dispense_reagents = list(
"coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice",
"orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint"
)
)

View File

@@ -111,6 +111,7 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead
)
@@ -139,4 +140,4 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/berry,
)
)

View File

@@ -132,7 +132,7 @@
recharge_time = 3
volume = 60
possible_transfer_amounts = list(5, 10, 20, 30)
reagent_ids = list("ale", "beer", "berryjuice", "bitters", "coffee", "cognac", "cola", "dr_gibb", "egg", "gin", "gingerale", "hot_coco", "ice", "icetea", "kahlua", "lemonjuice", "lemon_lime", "limejuice", "mead", "milk", "mint", "orangejuice", "rum", "sake", "sodawater", "soymilk", "space_up", "spacemountainwind", "specialwhiskey", "sugar", "tea", "tequilla", "tomatojuice", "tonic", "vermouth", "vodka", "water", "watermelonjuice", "whiskey", "wine")
reagent_ids = list("ale", "cider", "beer", "berryjuice", "bitters", "coffee", "cognac", "cola", "dr_gibb", "egg", "gin", "gingerale", "hot_coco", "ice", "icetea", "kahlua", "lemonjuice", "lemon_lime", "limejuice", "mead", "milk", "mint", "orangejuice", "rum", "sake", "sodawater", "soymilk", "space_up", "spacemountainwind", "specialwhiskey", "sugar", "tea", "tequilla", "tomatojuice", "tonic", "vermouth", "vodka", "water", "watermelonjuice", "whiskey", "wine")
/obj/item/weapon/reagent_containers/borghypo/service/attack(var/mob/M, var/mob/user)
return

View File

@@ -15,7 +15,7 @@
/obj/item/weapon/reagent_containers/pill/Initialize()
. = ..()
if(!icon_state)
icon_state = "pill[rand(1, 20)]"
icon_state = "pill[rand(1, 4)]" //preset pills only use colour changing or unique icons
/obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob)
if(M == user)
@@ -92,27 +92,29 @@
//Pills
/obj/item/weapon/reagent_containers/pill/antitox
name = "Anti-toxins pill"
desc = "Neutralizes many common toxins. Contains 25 units of Dylovene."
icon_state = "pill17"
name = "Dylovene (25u)"
desc = "Neutralizes many common toxins."
icon_state = "pill1"
/obj/item/weapon/reagent_containers/pill/antitox/Initialize()
. = ..()
reagents.add_reagent("anti_toxin", 25)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/tox
name = "Toxins pill"
desc = "Highly toxic." //this is cooler without "contains 50u toxin"
icon_state = "pill5"
desc = "Highly toxic."
icon_state = "pill4"
/obj/item/weapon/reagent_containers/pill/tox/Initialize()
. = ..()
reagents.add_reagent("toxin", 50)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/cyanide
name = "Cyanide pill"
desc = "Don't swallow this." //this is cooler without "contains 50u cyanide"
icon_state = "pill5"
name = "Strange pill"
desc = "It's marked 'KCN'. Smells vaguely of almonds."
icon_state = "pill9"
/obj/item/weapon/reagent_containers/pill/cyanide/Initialize()
. = ..()
@@ -121,186 +123,194 @@
/obj/item/weapon/reagent_containers/pill/adminordrazine
name = "Adminordrazine pill"
desc = "It's magic. We don't have to explain it." //it's space magic you don't need the quantity
icon_state = "pill15"
desc = "It's magic. We don't have to explain it."
icon_state = "pillA"
/obj/item/weapon/reagent_containers/pill/adminordrazine/Initialize()
. = ..()
reagents.add_reagent("adminordrazine", 5)
/obj/item/weapon/reagent_containers/pill/stox
name = "Sleeping pill"
desc = "Commonly used to treat insomnia. Contains 15 units of Soporific."
icon_state = "pill8"
name = "Soporific (15u)"
desc = "Commonly used to treat insomnia."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/stox/Initialize()
. = ..()
reagents.add_reagent("stoxin", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/kelotane
name = "Kelotane pill"
desc = "Used to treat burns. Contains 15 units of Kelotane."
icon_state = "pill11"
name = "Kelotane (15u)"
desc = "Used to treat burns."
icon_state = "pill3"
/obj/item/weapon/reagent_containers/pill/kelotane/Initialize()
. = ..()
reagents.add_reagent("kelotane", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/paracetamol
name = "Paracetamol pill"
desc = "Paracetamol! A painkiller for the ages. Chewables! Contains 15 units of Paracetamol."
icon_state = "pill8"
name = "Paracetamol (15u)"
desc = "Paracetamol! A painkiller for the ages. Chewables!"
icon_state = "pill3"
/obj/item/weapon/reagent_containers/pill/paracetamol/Initialize()
. = ..()
reagents.add_reagent("paracetamol", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/tramadol
name = "Tramadol pill"
desc = "A simple painkiller. Contains 15 units of Tramadol."
icon_state = "pill8"
name = "Tramadol (15u)"
desc = "A simple painkiller."
icon_state = "pill3"
/obj/item/weapon/reagent_containers/pill/tramadol/Initialize()
. = ..()
reagents.add_reagent("tramadol", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/methylphenidate
name = "Methylphenidate pill"
desc = "Improves the ability to concentrate. Contains 15 units of Methylphenidate."
icon_state = "pill8"
name = "Methylphenidate (15u)"
desc = "Improves the ability to concentrate."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/methylphenidate/Initialize()
. = ..()
reagents.add_reagent("methylphenidate", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/citalopram
name = "Citalopram pill"
desc = "Mild anti-depressant. Contains 15 units of Citalopram."
icon_state = "pill8"
name = "Citalopram (15u)"
desc = "Mild anti-depressant."
icon_state = "pill4"
/obj/item/weapon/reagent_containers/pill/citalopram/Initialize()
. = ..()
reagents.add_reagent("citalopram", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/dexalin
name = "Dexalin pill"
desc = "Used to treat oxygen deprivation. Contains 15 units of Dexalin."
icon_state = "pill16"
name = "Dexalin (15u)"
desc = "Used to treat oxygen deprivation."
icon_state = "pill1"
/obj/item/weapon/reagent_containers/pill/dexalin/Initialize()
. = ..()
reagents.add_reagent("dexalin", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/dexalin_plus
name = "Dexalin Plus pill"
desc = "Used to treat extreme oxygen deprivation. Contains 15 units of Dexalin Plus."
icon_state = "pill8"
name = "Dexalin Plus (15u)"
desc = "Used to treat extreme oxygen deprivation."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/dexalin_plus/Initialize()
. = ..()
reagents.add_reagent("dexalinp", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/dermaline
name = "Dermaline pill"
desc = "Used to treat burn wounds. Contains 15 units of Dermaline."
icon_state = "pill12"
name = "Dermaline (15u)"
desc = "Used to treat burn wounds."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/dermaline/Initialize()
. = ..()
reagents.add_reagent("dermaline", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/dylovene
name = "Dylovene pill"
desc = "A broad-spectrum anti-toxin. Contains 15 units of Dylovene."
icon_state = "pill13"
name = "Dylovene (15u)"
desc = "A broad-spectrum anti-toxin."
icon_state = "pill1"
/obj/item/weapon/reagent_containers/pill/dylovene/Initialize()
. = ..()
reagents.add_reagent("anti_toxin", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/inaprovaline
name = "Inaprovaline pill"
desc = "Used to stabilize patients. Contains 30 units of Inaprovaline."
icon_state = "pill20"
name = "Inaprovaline (30u)"
desc = "Used to stabilize patients."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/inaprovaline/Initialize()
. = ..()
reagents.add_reagent("inaprovaline", 30)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/bicaridine
name = "Bicaridine pill"
desc = "Used to treat physical injuries. Contains 20 units of Bicaridine."
icon_state = "pill18"
name = "Bicaridine (20u)"
desc = "Used to treat physical injuries."
icon_state = "pill2"
/obj/item/weapon/reagent_containers/pill/bicaridine/Initialize()
. = ..()
reagents.add_reagent("bicaridine", 20)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/spaceacillin
name = "Spaceacillin pill"
desc = "A theta-lactam antibiotic. Effective against many diseases likely to be encountered in space. Contains 15 units of Spaceacillin."
icon_state = "pill19"
name = "Spaceacillin (10u)"
desc = "A theta-lactam antibiotic. Effective against many diseases likely to be encountered in space."
icon_state = "pill3"
/obj/item/weapon/reagent_containers/pill/spaceacillin/Initialize()
. = ..()
reagents.add_reagent("spaceacillin", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/carbon
name = "Carbon pill"
desc = "Used to neutralise chemicals in the stomach. Contains 15 units of Carbon."
icon_state = "pill7"
name = "Carbon (15u)"
desc = "Used to neutralise chemicals in the stomach."
icon_state = "pill3"
/obj/item/weapon/reagent_containers/pill/carbon/Initialize()
. = ..()
reagents.add_reagent("carbon", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/iron
name = "Iron pill"
desc = "Used to aid in blood regeneration after bleeding. Contains 15 units of Iron."
icon_state = "pill4"
name = "Iron (15u)"
desc = "Used to aid in blood regeneration after bleeding."
icon_state = "pill1"
/obj/item/weapon/reagent_containers/pill/iron/Initialize()
. = ..()
reagents.add_reagent("iron", 15)
color = reagents.get_color()
//Not-quite-medicine
/obj/item/weapon/reagent_containers/pill/happy
name = "Happy pill"
desc = "Happy happy joy joy!" //we're not giving quantities for shady maint drugs
icon_state = "pill18"
desc = "Happy happy joy joy!"
icon_state = "pill4"
/obj/item/weapon/reagent_containers/pill/happy/Initialize()
. = ..()
reagents.add_reagent("space_drugs", 15)
reagents.add_reagent("sugar", 15)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/zoom
name = "Zoom pill"
desc = "Zoooom!"
icon_state = "pill18"
icon_state = "pill4"
/obj/item/weapon/reagent_containers/pill/zoom/Initialize()
. = ..()
reagents.add_reagent("impedrezene", 10)
reagents.add_reagent("synaptizine", 5)
reagents.add_reagent("hyperzine", 5)
color = reagents.get_color()
/obj/item/weapon/reagent_containers/pill/diet
name = "diet pill"
desc = "Guaranteed to get you slim!"
icon_state = "pill9"
icon_state = "pill4"
/obj/item/weapon/reagent_containers/pill/diet/Initialize()
. = ..()
reagents.add_reagent("lipozine", 2)
reagents.add_reagent("lipozine", 2)
color = reagents.get_color()

View File

@@ -467,7 +467,14 @@ CIRCUITS BELOW
req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
sort_string = "NAACC"
/* //Uncomment me to allow Serenity construction
/datum/design/circuit/mecha/gygax_medical
name = "'Serenity' medical control"
id = "gygax_medical"
req_tech = list(TECH_DATA = 4, TECH_BIO = 2)
build_path = /obj/item/weapon/circuitboard/mecha/gygax/medical
sort_string = "NAACD"
*/
/datum/design/circuit/mecha/durand_main
name = "'Durand' central control"
id = "durand_main"

View File

@@ -19,8 +19,9 @@
sort_string = "VASBA"
/datum/design/item/weapon/esword
name = "Portable Energy Blade"
id = "chargesword"
req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ANOMALY = 1)
req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ARCANE = 1)
materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500)
build_path = /obj/item/weapon/melee/energy/sword/charge
sort_string = "VASCA"

View File

@@ -107,7 +107,13 @@
/datum/design/item/mechfab/gygax
category = "Gygax"
/* //uncomment me to make the Serenity produceable in Robotics
/datum/design/item/mechfab/gygax/chassis/serenity
name = "Serenity Chassis"
id = "serenity_chassis"
build_path = /obj/item/mecha_parts/chassis/serenity
materials = list(DEFAULT_WALL_MATERIAL = 18750, "phoron" = 4000)
*/
/datum/design/item/mechfab/gygax/chassis
name = "Gygax Chassis"
id = "gygax_chassis"