mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-25 09:31:30 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into CivilianExpansion1
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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(..())
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
31
code/game/objects/items/weapons/melee/deflect.dm
Normal file
31
code/game/objects/items/weapons/melee/deflect.dm
Normal 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
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
if(!opened)
|
||||
icon_state = icon_closed
|
||||
if(sealed)
|
||||
overlays += "sealed"
|
||||
overlays += "welded"
|
||||
else
|
||||
icon_state = icon_opened
|
||||
|
||||
|
||||
@@ -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)]"
|
||||
. = ..()
|
||||
. = ..()
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
33
code/modules/gamemaster/actions/planet_weather_change.dm
Normal file
33
code/modules/gamemaster/actions/planet_weather_change.dm
Normal 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
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
21
code/modules/metric/count.dm
Normal file
21
code/modules/metric/count.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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))
|
||||
|
||||
92
code/modules/organs/internal/bioaugment.dm
Normal file
92
code/modules/organs/internal/bioaugment.dm
Normal 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>")
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user