Merge remote-tracking branch 'upstream/master' into ports-tailoring

This commit is contained in:
Fox McCloud
2019-08-27 18:23:11 -04:00
97 changed files with 4941 additions and 778 deletions
+4 -4
View File
@@ -49652,8 +49652,8 @@
/obj/item/radio/intercom{
pixel_y = 28
},
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
icon_state = "vault";
dir = 8
@@ -49673,8 +49673,8 @@
},
/area/security/armoury)
"bLK" = (
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
icon_state = "vault";
dir = 8
@@ -4795,10 +4795,10 @@
/obj/structure/reagent_dispensers/peppertank{
pixel_y = 29
},
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
tag = "icon-vault (WEST)";
icon_state = "vault";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7 -6
View File
@@ -4055,7 +4055,7 @@
/turf/simulated/floor/plasteel,
/area/security/armoury)
"ahH" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 8
},
@@ -4155,7 +4155,7 @@
},
/area/security/brig)
"ahR" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 4
},
@@ -4324,7 +4324,7 @@
},
/area/security/brig)
"aif" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 8
},
@@ -4370,7 +4370,7 @@
},
/area/security/brig)
"aij" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 4
},
@@ -32864,8 +32864,8 @@
/obj/machinery/light{
dir = 1
},
/obj/structure/reagent_dispensers/watertank/high,
/obj/item/reagent_containers/glass/bucket,
/obj/structure/table,
/obj/machinery/smartfridge/disks,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -36338,6 +36338,7 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/bar)
"bou" = (
/obj/item/reagent_containers/glass/bucket,
/obj/structure/sink{
icon_state = "sink";
dir = 8;
+3 -1
View File
@@ -19,6 +19,8 @@
// Lavaland Ruins
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_beach.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_clown_planet.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_winter.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_animal_hospital.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_ash_walker1.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk1.dmm"
@@ -44,7 +46,7 @@
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_syndicate_base1.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_ufo_crash.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_xeno_nest.dmm"
// Space Ruins
#include "map_files\RandomRuins\SpaceRuins\abandonedzoo.dmm"
+3
View File
@@ -105,6 +105,9 @@
#define NUTRITION_LEVEL_STARVING 150
#define NUTRITION_LEVEL_CURSED 0
//Used as an upper limit for species that continuously gain nutriment
#define NUTRITION_LEVEL_ALMOST_FULL 535
//Blood levels
#define BLOOD_VOLUME_MAXIMUM 2000
#define BLOOD_VOLUME_NORMAL 560
+13
View File
@@ -12,6 +12,19 @@
Comes with a rustic wooden bar and suicidal bartender."
suffix = "lavaland_biodome_beach.dmm"
/datum/map_template/ruin/lavaland/biodome/winter
name = "Biodome Winter"
id = "biodome-winter"
description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \
Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)."
suffix = "lavaland_biodome_winter.dmm"
/datum/map_template/ruin/lavaland/biodome/clown
name = "Biodome Clown Planet"
id = "biodome-clown"
description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!"
suffix = "lavaland_biodome_clown_planet.dmm"
/datum/map_template/ruin/lavaland/cube
name = "The Wishgranter Cube"
id = "wishgranter-cube"
+1 -2
View File
@@ -1,7 +1,6 @@
/obj/effect/proc_holder/spell/targeted/charge
name = "Charge"
desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
school = "transmutation"
charge_max = 600
clothes_req = 0
@@ -10,7 +9,7 @@
range = -1
cooldown_min = 400 //50 deciseconds reduction per rank
include_user = 1
action_icon_state = "charge"
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
for(var/mob/living/L in targets)
-2
View File
@@ -11,8 +11,6 @@
cooldown_min = 10 //Gun wizard
action_icon_state = "bolt_action"
/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
C.drop_item()
+1
View File
@@ -72,6 +72,7 @@
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
desc = "This always-on spell allows you to cast magic without your garments."
action_icon_state = "no_clothes"
/obj/effect/proc_holder/spell/targeted/genetic/mutate
name = "Mutate"
+4 -4
View File
@@ -482,10 +482,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/securitybarriers
name = "Security Barriers Crate"
contains = list(/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier)
contains = list(/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier)
cost = 20
containername = "security barriers crate"
+3
View File
@@ -12,6 +12,9 @@
/area/ruin/powered/snow_biodome
icon_state = "dk_yellow"
/area/ruin/powered/snow_cabin
icon_state = "bar"
/area/ruin/powered/gluttony
icon_state = "dk_yellow"
@@ -290,10 +290,10 @@
emote_hear = list("gaffaws", "laughs")
response_help = "hugs"
attacktext = "wildly tickles"
maxHealth = 150
health = 150
melee_damage_lower = 20
melee_damage_upper = 20
maxHealth = 175
health = 175
melee_damage_lower = 25
melee_damage_upper = 25
attack_sound = 'sound/items/bikehorn.ogg'
feast_sound = 'sound/spookoween/scary_horn2.ogg'
File diff suppressed because it is too large Load Diff
+210 -241
View File
@@ -1,144 +1,231 @@
/*
CONTAINS:
#define SINGLE "single"
#define VERTICAL "vertical"
#define HORIZONTAL "horizontal"
Deployable items
Barricades
#define METAL 1
#define WOOD 2
#define SAND 3
for reference:
//Barricades/cover
access_security = 1
access_brig = 2
access_armory = 3
access_forensics_lockers= 4
access_medical = 5
access_morgue = 6
access_tox = 7
access_tox_storage = 8
access_genetics = 9
access_engine = 10
access_engine_equip= 11
access_maint_tunnels = 12
access_external_airlocks = 13
access_emergency_storage = 14
access_change_ids = 15
access_ai_upload = 16
access_teleporter = 17
access_eva = 18
access_heads = 19
access_captain = 20
access_all_personal_lockers = 21
access_chapel_office = 22
access_tech_storage = 23
access_atmospherics = 24
access_bar = 25
access_janitor = 26
access_crematorium = 27
access_kitchen = 28
access_robotics = 29
access_rd = 30
access_cargo = 31
access_construction = 32
access_chemistry = 33
access_cargo_bot = 34
access_hydroponics = 35
access_manufacturing = 36
access_library = 37
access_lawyer = 38
access_virology = 39
access_cmo = 40
access_qm = 41
access_court = 42
access_clown = 43
access_mime = 44
*/
//Barricades, maybe there will be a metal one later...
/obj/structure/barricade
anchored = 1.0
density = 1.0
var/health = 100.0
var/maxhealth = 100.0
name = "chest high wall"
desc = "Looks like this would make good cover."
anchored = TRUE
density = TRUE
max_integrity = 100
var/proj_pass_rate = 50 //How many projectiles will pass the cover. Lower means stronger cover
var/bar_material = METAL
var/drop_amount = 3
var/stacktype = /obj/item/stack/sheet/metal
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, stacktype))
if(src.health < src.maxhealth)
visible_message("<span class='warning'>[user] begins to repair the [src]!</span>")
if(do_after(user, 20 * W.toolspeed, target = src))
src.health = src.maxhealth
W:use(1)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
else
return
return
else if(istype(W, /obj/item/crowbar))
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("<span class='notice'>[user] is prying apart \the [src].</span>", "<span class='notice'>You begin to pry apart \the [src].</span>")
playsound(src, W.usesound, 200, 1)
/obj/structure/barricade/blob_act(obj/structure/blob/B) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
take_damage(400, BRUTE, "melee", 0, get_dir(src, B))
if(do_after(user, 300 * W.toolspeed, target = src) && !QDELETED(src))
user.visible_message("<span class='notice'>[user] pries apart \the [src].</span>", "<span class='notice'>You pry apart \the [src].</span>")
dismantle()
/obj/structure/barricade/ex_act(severity) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
if(resistance_flags & INDESTRUCTIBLE)
return
else
switch(W.damtype)
if("fire")
src.health -= W.force * 1
if("brute")
src.health -= W.force * 0.75
else
if(src.health <= 0)
visible_message("<span class='danger'>\The [src] is smashed apart!</span>")
dismantle()
..()
/obj/structure/barricade/ex_act(severity)
switch(severity)
if(1.0)
visible_message("<span class='danger'>\The [src] is blown apart!</span>")
if(1)
obj_integrity = 0
qdel(src)
return
if(2.0)
src.health -= 25
if(src.health <= 0)
visible_message("<span class='danger'>\The [src] is blown apart!</span>")
dismantle()
return
if(2)
take_damage(rand(100, 250), BRUTE, "bomb", 0)
if(3)
take_damage(rand(10, 90), BRUTE, "bomb", 0)
/obj/structure/barricade/blob_act()
src.health -= 25
if(src.health <= 0)
visible_message("<span class='danger'>The blob eats through \the [src]!</span>")
qdel(src)
return
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
/obj/structure/barricade/mech_melee_attack(obj/mecha/M) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
M.do_attack_animation(src)
var/play_soundeffect = 0
var/mech_damtype = M.damtype
if(M.selected)
mech_damtype = M.selected.damtype
play_soundeffect = 1
else
return 0
switch(M.damtype)
if(BRUTE)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if(BURN)
playsound(src, 'sound/items/welder.ogg', 50, 1)
if(TOX)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
return 0
else
return 0
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
return take_damage(M.force*3, mech_damtype, "melee", play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs.
/obj/structure/barricade/proc/dismantle()
if(stacktype)
new stacktype(get_turf(src))
new stacktype(get_turf(src))
new stacktype(get_turf(src))
/obj/structure/barricade/deconstruct(disassembled = TRUE)
make_debris()
qdel(src)
/obj/structure/barricade/proc/make_debris()
if(stacktype)
new stacktype(get_turf(src), drop_amount)
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
if(iswelder(I) && user.a_intent != INTENT_HARM && bar_material == METAL)
var/obj/item/weldingtool/WT = I
if(obj_integrity < max_integrity)
if(WT.remove_fuel(0, user))
to_chat(user, "<span class='notice'>You begin repairing [src]...</span>")
playsound(loc, WT.usesound, 40, 1)
if(do_after(user, 40 * I.toolspeed, target = src))
obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
else
return ..()
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
if(locate(/obj/structure/barricade) in get_turf(mover))
return TRUE
else if(istype(mover, /obj/item/projectile))
if(!anchored)
return TRUE
var/obj/item/projectile/proj = mover
if(proj.firer && Adjacent(proj.firer))
return TRUE
if(prob(proj_pass_rate))
return TRUE
return FALSE
else
return !density
/////BARRICADE TYPES///////
/obj/structure/barricade/wooden
name = "wooden barricade"
desc = "This space is blocked off by a wooden barricade."
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
bar_material = WOOD
stacktype = /obj/item/stack/sheet/wood
burn_state = FLAMMABLE
burntime = 25
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user)
if(istype(I,/obj/item/stack/sheet/wood))
var/obj/item/stack/sheet/wood/W = I
if(W.amount < 5)
to_chat(user, "<span class='warning'>You need at least five wooden planks to make a wall!</span>")
return
else
to_chat(user, "<span class='notice'>You start adding [I] to [src]...</span>")
if(do_after(user, 50, target = src))
W.use(5)
new /turf/simulated/wall/mineral/wood/nonmetal(get_turf(src))
qdel(src)
return
return ..()
/obj/structure/barricade/wooden/crude
name = "crude plank barricade"
desc = "This space is blocked off by a crude assortment of planks."
icon_state = "woodenbarricade-old"
drop_amount = 1
max_integrity = 50
proj_pass_rate = 65
/obj/structure/barricade/wooden/crude/snow
desc = "This space is blocked off by a crude assortment of planks. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow-old"
max_integrity = 75
/obj/structure/barricade/sandbags
name = "sandbags"
desc = "Bags of sand. Self explanatory."
icon = 'icons/obj/smooth_structures/sandbags.dmi'
icon_state = "sandbags"
max_integrity = 280
proj_pass_rate = 20
pass_flags = LETPASSTHROW
bar_material = SAND
climbable = TRUE
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/simulated/wall, /turf/simulated/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/simulated/wall/rust, /turf/simulated/wall/r_wall/rust, /obj/structure/barricade/security)
stacktype = null
/obj/structure/barricade/security
name = "security barrier"
desc = "A deployable barrier. Provides good cover in fire fights."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
density = FALSE
anchored = FALSE
max_integrity = 180
proj_pass_rate = 20
armor = list(melee = 10, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100)
stacktype = null
var/deploy_time = 40
var/deploy_message = TRUE
/obj/structure/barricade/security/New()
..()
addtimer(CALLBACK(src, .proc/deploy), deploy_time)
/obj/structure/barricade/security/proc/deploy()
icon_state = "barrier1"
density = TRUE
anchored = TRUE
if(deploy_message)
visible_message("<span class='warning'>[src] deploys!</span>")
/obj/item/grenade/barrier
name = "barrier grenade"
desc = "Instant cover."
icon = 'icons/obj/grenade.dmi'
icon_state = "flashbang"
item_state = "flashbang"
actions_types = list(/datum/action/item_action/toggle_barrier_spread)
var/mode = SINGLE
/obj/item/grenade/barrier/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>Alt-click to toggle modes.</span>")
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.Adjacent(src) || user.incapacitated())
return
toggle_mode(user)
/obj/item/grenade/barrier/proc/toggle_mode(mob/user)
switch(mode)
if(SINGLE)
mode = VERTICAL
if(VERTICAL)
mode = HORIZONTAL
if(HORIZONTAL)
mode = SINGLE
to_chat(user, "[src] is now in [mode] mode.")
/obj/item/grenade/barrier/prime()
new /obj/structure/barricade/security(get_turf(loc))
switch(mode)
if(VERTICAL)
var/target_turf = get_step(src, NORTH)
if(!(is_blocked_turf(target_turf)))
new /obj/structure/barricade/security(target_turf)
var/target_turf2 = get_step(src, SOUTH)
if(!(is_blocked_turf(target_turf2)))
new /obj/structure/barricade/security(target_turf2)
if(HORIZONTAL)
var/target_turf = get_step(src, EAST)
if(!(is_blocked_turf(target_turf)))
new /obj/structure/barricade/security(target_turf)
var/target_turf2 = get_step(src, WEST)
if(!(is_blocked_turf(target_turf2)))
new /obj/structure/barricade/security(target_turf2)
qdel(src)
/obj/item/grenade/barrier/ui_action_click(mob/user)
toggle_mode(user)
/obj/structure/barricade/mime
name = "floor"
desc = "Is... this a floor?"
@@ -149,128 +236,10 @@ for reference:
/obj/structure/barricade/mime/mrcd
stacktype = null
//Actual Deployable machinery stuff
#undef SINGLE
#undef VERTICAL
#undef HORIZONTAL
/obj/machinery/deployable
name = "deployable"
desc = "deployable"
icon = 'icons/obj/objects.dmi'
req_access = list(access_security)//I'm changing this until these are properly tested./N
/obj/machinery/deployable/barrier
name = "deployable barrier"
desc = "A deployable barrier. Swipe your ID card to lock/unlock it."
icon = 'icons/obj/objects.dmi'
anchored = 0.0
density = 1.0
icon_state = "barrier0"
var/health = 100.0
var/maxhealth = 100.0
var/locked = 0.0
// req_access = list(access_maint_tunnels)
/obj/machinery/deployable/barrier/New()
..()
src.icon_state = "barrier[src.locked]"
/obj/machinery/deployable/barrier/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/card/id))
if(src.allowed(user))
if(src.emagged < 2.0)
src.locked = !src.locked
src.anchored = !src.anchored
src.icon_state = "barrier[src.locked]"
if((src.locked == 1.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled on.")
return
else if((src.locked == 0.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled off.")
return
else
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
return
return
else if(istype(W, /obj/item/wrench))
if(src.health < src.maxhealth)
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
else if(src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
return
else
switch(W.damtype)
if("fire")
src.health -= W.force * 0.75
if("brute")
src.health -= W.force * 0.5
else
if(src.health <= 0)
src.explode()
..()
/obj/machinery/deployable/barrier/emag_act(user as mob)
if(!emagged)
emagged = 1
req_access = null
to_chat(user, "You break the ID authentication lock on the [src].")
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
else if(src.emagged == 1)
src.emagged = 2
to_chat(user, "You short out the anchoring mechanism on the [src].")
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
/obj/machinery/deployable/barrier/ex_act(severity)
switch(severity)
if(1.0)
src.explode()
return
if(2.0)
src.health -= 25
if(src.health <= 0)
src.explode()
return
/obj/machinery/deployable/barrier/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(prob(50/severity))
locked = !locked
anchored = !anchored
icon_state = "barrier[src.locked]"
/obj/machinery/deployable/barrier/blob_act()
src.health -= 25
if(src.health <= 0)
src.explode()
return
/obj/machinery/deployable/barrier/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
else
return 0
/obj/machinery/deployable/barrier/proc/explode()
visible_message("<span class='danger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
/* var/obj/item/stack/rods/ =*/
new /obj/item/stack/rods(Tsec)
do_sparks(3, 1, src)
explosion(src.loc,-1,-1,0)
if(src)
qdel(src)
#undef METAL
#undef WOOD
#undef SAND
@@ -6,18 +6,18 @@
anchored = TRUE
var/amount = 1 //Basically moles.
/obj/effect/decal/cleanable/liquid_fuel/Initialize(newLoc, amt = 1)
/obj/effect/decal/cleanable/liquid_fuel/Initialize(mapload, amt = 1)
. = ..()
amount = amt
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
for(var/obj/effect/decal/cleanable/liquid_fuel/other in loc)
if(other != src)
other.amount += amount
spawn other.Spread()
qdel(src)
Spread()
. = ..()
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
@@ -33,7 +33,7 @@ var/global/list/image/splatter_cache = list()
return ..()
/obj/effect/decal/cleanable/blood/Initialize()
/obj/effect/decal/cleanable/blood/Initialize(mapload)
. = ..()
update_icon()
if(GAMEMODE_IS_CULT)
@@ -137,7 +137,7 @@ var/global/list/image/splatter_cache = list()
amount = 0
var/message
/obj/effect/decal/cleanable/blood/writing/Initialize()
/obj/effect/decal/cleanable/blood/writing/Initialize(mapload)
. = ..()
if(random_icon_states.len)
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
@@ -210,7 +210,7 @@ var/global/list/image/splatter_cache = list()
break
/obj/effect/decal/cleanable/blood/old/Initialize()
/obj/effect/decal/cleanable/blood/old/Initialize(mapload)
. = ..()
bloodiness = 0
dry()
@@ -218,7 +218,7 @@ var/global/list/image/splatter_cache = list()
/obj/effect/decal/cleanable/blood/old/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/blood/gibs/old/Initialize()
/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload)
. = ..()
bloodiness = 0
dry()
@@ -31,8 +31,8 @@
smooth = SMOOTH_MORE
mouse_opacity = FALSE
/obj/effect/decal/cleanable/dirt/Initialize()
..()
/obj/effect/decal/cleanable/dirt/Initialize(mapload)
. = ..()
icon_state = ""
/obj/effect/decal/cleanable/dirt/blackpowder
@@ -56,7 +56,7 @@
desc = "It's foam."
color = "#EBEBEB"
/obj/effect/decal/cleanable/flour/foam/Initialize()
/obj/effect/decal/cleanable/flour/foam/Initialize(mapload)
. = ..()
QDEL_IN(src, 15 SECONDS)
@@ -99,7 +99,7 @@
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = FALSE
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
@@ -65,7 +65,6 @@
if(smooth)
queue_smooth(src)
queue_smooth_neighbors(src)
..()
/obj/effect/decal/cleanable/Destroy()
if(smooth)
+2 -3
View File
@@ -7,9 +7,8 @@
anchored = TRUE
/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
..()
loc = location
/obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
. = ..()
name = e_name
desc = "A [name] drawn in crayon."
+2 -2
View File
@@ -18,8 +18,8 @@
/obj/effect/decal/cleanable/random
name = "Random Mess"
/obj/effect/decal/cleanable/random/New()
..()
/obj/effect/decal/cleanable/random/Initialize(mapload)
. = ..()
var/list/list = subtypesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2)
var/T = pick(list)
new T(loc)
+13
View File
@@ -123,6 +123,19 @@
origin_tech = "biotech=2"
stop_bleeding = 1800
/obj/item/stack/medical/bruise_pack/attackby(obj/item/I, mob/user, params)
if(I.sharp)
if(get_amount() < 2)
to_chat(user, "<span class='warning'>You need at least two gauzes to do this!</span>")
return
new /obj/item/stack/sheet/cloth(user.drop_location())
user.visible_message("[user] cuts [src] into pieces of cloth with [I].", \
"<span class='notice'>You cut [src] into pieces of cloth with [I].</span>", \
"<span class='italics'>You hear cutting.</span>")
use(2)
else
return ..()
/obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user)
if(..())
return 1
@@ -137,6 +137,44 @@ var/global/list/datum/stack_recipe/snow_recipes = list(
..()
recipes = sandstone_recipes
/*
* Sandbags
*/
/obj/item/stack/sheet/mineral/sandbags
name = "sandbags"
icon_state = "sandbags"
singular_name = "sandbag"
layer = LOW_ITEM_LAYER
merge_type = /obj/item/stack/sheet/mineral/sandbags
GLOBAL_LIST_INIT(sandbag_recipes, list ( \
new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 25, one_per_turf = 1, on_floor = 1), \
))
/obj/item/stack/sheet/mineral/sandbags/New()
recipes = GLOB.sandbag_recipes
..()
/obj/item/emptysandbag
name = "empty sandbag"
desc = "A bag to be filled with sand."
icon = 'icons/obj/items.dmi'
icon_state = "sandbag"
w_class = WEIGHT_CLASS_TINY
/obj/item/emptysandbag/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/G = I
to_chat(user, "<span class='notice'>You fill the sandbag.</span>")
var/obj/item/stack/sheet/mineral/sandbags/S = new /obj/item/stack/sheet/mineral/sandbags(drop_location())
qdel(src)
if(Adjacent(user) && !issilicon(user))
user.put_in_hands(S)
G.use(1)
else
return ..()
/obj/item/stack/sheet/mineral/diamond
name = "diamond"
icon_state = "sheet-diamond"
@@ -221,6 +221,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/bruise_pack/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3), \
+1 -1
View File
@@ -299,7 +299,7 @@
/obj/effect/decal/cleanable/ash/snappop_phoenix
var/respawn_time = 300
/obj/effect/decal/cleanable/ash/snappop_phoenix/New()
/obj/effect/decal/cleanable/ash/snappop_phoenix/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/respawn), respawn_time)
@@ -1059,6 +1059,15 @@
desc = "A colorful cardboard box for the clown"
icon_state = "box_clown"
/obj/item/storage/box/emptysandbags
name = "box of empty sandbags"
/obj/item/storage/box/emptysandbags/New()
..()
contents = list()
for(var/i in 1 to 7)
new /obj/item/emptysandbag(src)
/obj/item/storage/box/rndboards
name = "the Liberator's legacy"
desc = "A box containing a gift for worthy golems."
@@ -48,38 +48,38 @@
return
if(!on)
turn_on()
turn_on(user)
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
else
turn_off()
turn_off(user)
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/tank/jetpack/proc/turn_on()
/obj/item/tank/jetpack/proc/turn_on(mob/user)
on = TRUE
icon_state = "[initial(icon_state)]-on"
ion_trail.start()
/obj/item/tank/jetpack/proc/turn_off()
/obj/item/tank/jetpack/proc/turn_off(mob/user)
on = FALSE
stabilizers = FALSE
icon_state = initial(icon_state)
ion_trail.stop()
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob)
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
if(!on)
return 0
if((num < 0.005 || air_contents.total_moles() < num))
turn_off()
turn_off(user)
return 0
var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005)
turn_off()
turn_off(user)
return 0
var/turf/T = get_turf(user)
@@ -163,15 +163,65 @@
to_chat(user, "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>")
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/tank/jetpack/carbondioxide/mining
name = "mining jetpack"
/obj/item/tank/jetpack/suit
name = "hardsuit jetpack upgrade"
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
icon_state = "jetpack-mining"
item_state = "jetpack-mining"
item_state = "jetpack-black"
origin_tech = "materials=4;magnets=4;engineering=5"
desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
volume = 40
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
volume = 1
slot_flags = null
var/datum/gas_mixture/temp_air_contents
var/obj/item/tank/tank = null
var/mob/living/carbon/human/cur_user
/obj/item/tank/jetpack/suit/New()
..()
STOP_PROCESSING(SSobj, src)
temp_air_contents = air_contents
/obj/item/tank/jetpack/suit/attack_self()
return
/obj/item/tank/jetpack/suit/cycle(mob/user)
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
to_chat(user, "<span class='warning'>[src] must be connected to a hardsuit!</span>")
return
var/mob/living/carbon/human/H = user
if(!istype(H.s_store, /obj/item/tank))
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
return
..()
/obj/item/tank/jetpack/suit/turn_on(mob/user)
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc) || loc.loc != user)
return
var/mob/living/carbon/human/H = user
tank = H.s_store
air_contents = tank.air_contents
START_PROCESSING(SSobj, src)
cur_user = user
..()
/obj/item/tank/jetpack/suit/turn_off(mob/user)
tank = null
air_contents = temp_air_contents
STOP_PROCESSING(SSobj, src)
cur_user = null
..()
/obj/item/tank/jetpack/suit/process()
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
turn_off(cur_user)
return
var/mob/living/carbon/human/H = loc.loc
if(!tank || tank != H.s_store)
turn_off(cur_user)
return
..()
/obj/item/tank/jetpack/rig
name = "jetpack"
@@ -182,7 +232,7 @@
to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.")
return 0
/obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob)
/obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user)
if(!on)
return 0
@@ -191,7 +241,7 @@
var/datum/gas_mixture/removed = holder.air_supply.air_contents.remove(num)
if(removed.total_moles() < 0.005)
turn_off()
turn_off(user)
return 0
var/turf/T = get_turf(user)
@@ -34,6 +34,15 @@ LINEN BINS
add_fingerprint(user)
return
/obj/item/bedsheet/attackby(obj/item/I, mob/user, params)
if(I.sharp)
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3)
transfer_fingerprints_to(C)
C.add_fingerprint(user)
qdel(src)
to_chat(user, "<span class='notice'>You tear [src] up.</span>")
else
return ..()
/obj/item/bedsheet/blue
icon_state = "sheetblue"
@@ -25,6 +25,7 @@
new /obj/item/clothing/glasses/welding/superior(src)
new /obj/item/clothing/gloves/color/yellow(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/tank/jetpack/suit(src)
new /obj/item/cartridge/ce(src)
new /obj/item/radio/headset/heads/ce(src)
new /obj/item/storage/toolbox/mechanical(src)
@@ -273,6 +273,7 @@
new /obj/item/key/ambulance(src)
new /obj/item/pinpointer/crew(src)
new /obj/item/clothing/shoes/magboots(src)
new /obj/item/handheld_defibrillator(src)
/obj/structure/closet/secure_closet/reagents
name = "chemical storage closet"
+16 -10
View File
@@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
/proc/updateDisplaycase(mob/living/carbon/human/captain)
if(!GLOB.captain_display_cases.len)
return
return
var/fingerprint = captain.get_full_print()
for(var/item in GLOB.captain_display_cases)
var/obj/structure/displaycase/CASE = item
@@ -113,6 +113,11 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
occupant = new start_showpiece_type(src)
update_icon()
/obj/structure/displaycase/Destroy()
dump()
QDEL_NULL(circuit)
return ..()
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
@@ -125,6 +130,16 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
. = ..()
GLOB.captain_display_cases += src
/obj/structure/displaycase/captains_laser/Destroy()
GLOB.captain_display_cases -= src
return ..()
/obj/structure/displaycase/lavaland_winter
burglar_alarm = TRUE
locked = TRUE
req_access = list(access_cent_specops)
start_showpiece_type = /obj/item/gun/energy/laser/captain
/obj/structure/displaycase/stechkin
name = "officer's display case"
desc = "A display case containing a humble stechkin pistol. Never forget your roots."
@@ -132,15 +147,6 @@ GLOBAL_LIST_INIT(captain_display_cases, list())
req_access = list(access_syndicate_command)
start_showpiece_type = /obj/item/gun/projectile/automatic/pistol
/obj/structure/displaycase/Destroy()
dump()
QDEL_NULL(circuit)
return ..()
/obj/structure/displaycase/captains_laser/Destroy()
GLOB.captain_display_cases -= src
return ..()
/obj/structure/displaycase/examine(mob/user)
..(user)
to_chat(user, "<span class='notice'>Peering through the glass, you see that it contains:</span>")
+8
View File
@@ -260,6 +260,14 @@
..()
icon_state = "rockpile[rand(1,5)]"
/obj/structure/flora/rock/icy
name = "icy rock"
color = "#cce9eb"
/obj/structure/flora/rock/pile/icy
name = "icy rocks"
color = "#cce9eb"
/obj/structure/flora/corn_stalk
name = "corn stalk"
icon = 'icons/obj/flora/plants.dmi'
+7 -7
View File
@@ -25,7 +25,7 @@
/turf/simulated/water_act(volume, temperature, source)
. = ..()
if(volume >= 3)
MakeSlippery()
@@ -37,7 +37,7 @@
assume_air(lowertemp)
qdel(hotspot)
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER, infinite = FALSE) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
if(wet >= wet_setting)
return
wet = wet_setting
@@ -57,11 +57,11 @@
else
wet_overlay = image('icons/effects/water.dmi', src, "wet_static")
overlays += wet_overlay
spawn(rand(790, 820)) // Purely so for visual effect
if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all.
return
MakeDry(wet_setting)
if(!infinite)
spawn(rand(790, 820)) // Purely so for visual effect
if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all.
return
MakeDry(wet_setting)
/turf/simulated/proc/MakeDry(wet_setting = TURF_WET_WATER)
if(wet > wet_setting)
@@ -53,6 +53,11 @@
to_chat(user, "<span class='danger'>You forcefully pry off the planks, destroying them in the process.</span>")
return make_plating()
/turf/simulated/floor/wood/cold
oxygen = 22
nitrogen = 82
temperature = 180
/turf/simulated/floor/grass
name = "grass patch"
icon_state = "grass1"
@@ -173,6 +173,18 @@
nitrogen = 0.01
temperature = TCMB
/turf/simulated/floor/mineral/bananium/lubed/Initialize(mapload)
. = ..()
MakeSlippery(TURF_WET_LUBE, TRUE)
/turf/simulated/floor/mineral/bananium/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
if(ishuman(user))
var/mob/living/carbon/human/H = user
to_chat(H, "<span class='warning'>You lose your footing trying to pry off the tile!</span>")
H.slip("the floor", 0, 5, tilesSlipped = 4, walkSafely = 0, slipAny = 1)
return
//TRANQUILLITE
/turf/simulated/floor/mineral/tranquillite
name = "silent floor"
+23 -3
View File
@@ -43,7 +43,7 @@
name = "beach"
icon = 'icons/misc/beach.dmi'
/turf/simulated/floor/beach/pry_tile(obj/item/C, mob/user, silent = FALSE)
/turf/simulated/floor/beach/pry_tile(obj/item/C, mob/user, silent = FALSE)
return
/turf/simulated/floor/beach/sand
@@ -79,7 +79,7 @@
/turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/OldLoc)
. = ..()
if(!linkedcontroller)
return
return
if(ismob(AM))
linkedcontroller.mobinpool += AM
@@ -107,6 +107,26 @@
/turf/simulated/floor/noslip/MakeSlippery()
return
/turf/simulated/floor/noslip/lavaland
oxygen = 14
nitrogen = 23
temperature = 300
/turf/simulated/floor/lubed
name = "slippery floor"
icon_state = "floor"
/turf/simulated/floor/lubed/Initialize(mapload)
. = ..()
MakeSlippery(TURF_WET_LUBE, TRUE)
/turf/simulated/floor/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
if(ishuman(user))
var/mob/living/carbon/human/H = user
to_chat(H, "<span class='warning'>You lose your footing trying to pry off the tile!</span>")
H.slip("the floor", 0, 5, tilesSlipped = 4, walkSafely = 0, slipAny = 1)
return
//Clockwork floor: Slowly heals toxin damage on nearby servants.
/turf/simulated/floor/clockwork
name = "clockwork floor"
@@ -124,7 +144,7 @@
new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/floor(src)
realappearence.linked = src
/turf/simulated/floor/clockwork/Destroy()
if(uses_overlay && realappearence)
QDEL_NULL(realappearence)
+27 -2
View File
@@ -7,7 +7,7 @@
broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
burnt_states = list("floorscorched1", "floorscorched2")
var/unfastened = FALSE
var/unfastened = FALSE
footstep_sounds = list(
"human" = list('sound/effects/footstep/plating_human.ogg'),
@@ -185,7 +185,7 @@
/turf/simulated/floor/engine/blob_act()
if(prob(25))
ChangeTurf(baseturf)
/turf/simulated/floor/engine/cult
name = "engraved floor"
icon_state = "cult"
@@ -335,3 +335,28 @@
/turf/simulated/floor/plating/abductor/New()
..()
icon_state = "alienpod[rand(1,9)]"
/turf/simulated/floor/plating/ice
name = "ice sheet"
desc = "A sheet of solid ice. Looks slippery."
icon = 'icons/turf/floors/ice_turfs.dmi'
icon_state = "unsmooth"
oxygen = 22
nitrogen = 82
temperature = 180
baseturf = /turf/simulated/floor/plating/ice
slowdown = TRUE
smooth = SMOOTH_TRUE
canSmoothWith = list(/turf/simulated/floor/plating/ice/smooth, /turf/simulated/floor/plating/ice)
/turf/simulated/floor/plating/ice/Initialize(mapload)
. = ..()
MakeSlippery(TURF_WET_PERMAFROST, TRUE)
/turf/simulated/floor/plating/ice/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
/turf/simulated/floor/plating/ice/smooth
icon_state = "smooth"
smooth = SMOOTH_MORE | SMOOTH_BORDER
canSmoothWith = list(/turf/simulated/floor/plating/ice/smooth, /turf/simulated/floor/plating/ice)
+17 -1
View File
@@ -140,7 +140,23 @@
sheet_type = /obj/item/stack/sheet/wood
hardness = 70
explosion_block = 0
canSmoothWith = list(/turf/simulated/wall/mineral/wood, /obj/structure/falsewall/wood)
canSmoothWith = list(/turf/simulated/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood/nonmetal)
/turf/simulated/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.sharp && W.force)
var/duration = (48 / W.force) * 2 //In seconds, for now.
if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/twohanded/fireaxe))
duration /= 4 //Much better with hatchets and axes.
if(do_after(user, duration * 10, target = src)) //Into deciseconds.
dismantle_wall(FALSE, FALSE)
return
return ..()
/turf/simulated/wall/mineral/wood/nonmetal
desc = "A solidly wooden wall. It's a bit weaker than a wall made with metal."
girder_type = /obj/structure/barricade/wooden
hardness = 50
canSmoothWith = list(/turf/simulated/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood/nonmetal)
/turf/simulated/wall/mineral/iron
name = "rough metal wall"
+3
View File
@@ -41,6 +41,9 @@ var/global/admin_ooc_colour = "#b82e00"
return
if(!check_rights(R_ADMIN|R_MOD,0))
if(!config.ooc_allowed)
to_chat(src, "<span class='danger'>OOC is globally muted.</span>")
return
if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN))
return
if(findtext(msg, "byond://"))
@@ -210,6 +210,7 @@
var/datum/objective/KillDaCrew = new /datum/objective
KillDaCrew.owner = S.mind
KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it."
KillDaCrew.completed = TRUE
S.mind.objectives += KillDaCrew
to_chat(S, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
to_chat(S, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
@@ -219,7 +220,8 @@
desc = "A magically infused bottle of clown love, distilled from \
countless hugging attacks. Used in funny rituals to attract \
adorable creatures."
color = "#FF69B4" // HOT PINK
icon = 'icons/obj/wizard.dmi'
icon_state = "vialtickles"
veil_msg = "<span class='warning'>You sense an adorable presence \
lurking just beyond the veil...</span>"
objective_verb = "Hug and tickle"
@@ -278,6 +280,7 @@
var/datum/objective/KillDaCrew = new /datum/objective
KillDaCrew.owner = M.mind
KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it."
KillDaCrew.completed = TRUE
M.mind.objectives += KillDaCrew
to_chat(M, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
to_chat(M, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
@@ -21,12 +21,4 @@
/datum/gear/lipstick/lime
display_name = "lipstick, lime"
path = /obj/item/lipstick/lime
/datum/gear/monocle
display_name = "monocle"
path = /obj/item/clothing/glasses/monocle
/datum/gear/sunglasses
display_name = "cheap sunglasses"
path = /obj/item/clothing/glasses/sunglasses_fake
path = /obj/item/lipstick/lime
@@ -18,12 +18,10 @@
/datum/gear/donor/furcape
display_name = "Fur Cape"
path = /obj/item/clothing/suit/furcape
cost = 2
/datum/gear/donor/furcoat
display_name = "Fur Coat"
path = /obj/item/clothing/suit/furcoat
cost = 2
/datum/gear/donor/kamina
display_name = "Spiky Orange-tinted Shades"
@@ -33,10 +31,6 @@
display_name = "Spiky Green-tinted Shades"
path = /obj/item/clothing/glasses/fluff/kamina/green
/datum/gear/donor/hipster
display_name = "Hipster Glasses"
path = /obj/item/clothing/glasses/regular/hipster
/datum/gear/donor/threedglasses
display_name = "Threed Glasses"
path = /obj/item/clothing/glasses/threedglasses
@@ -0,0 +1,24 @@
/datum/gear/glasses
subtype_path = /datum/gear/glasses
slot = slot_glasses
sort_category = "Glasses"
/datum/gear/glasses/sunglasses
display_name = "cheap sunglasses"
path = /obj/item/clothing/glasses/sunglasses_fake
/datum/gear/glasses/eyepatch
display_name = "Eyepatch"
path = /obj/item/clothing/glasses/eyepatch
/datum/gear/glasses/hipster
display_name = "Hipster glasses"
path = /obj/item/clothing/glasses/regular/hipster
/datum/gear/glasses/monocle
display_name = "Monocle"
path = /obj/item/clothing/glasses/monocle
/datum/gear/glasses/prescription
display_name = "Prescription glasses"
path = /obj/item/clothing/glasses/regular
@@ -0,0 +1,8 @@
/datum/gear/gloves
subtype_path = /datum/gear/gloves
slot = slot_gloves
sort_category = "Gloves"
/datum/gear/gloves/fingerless
display_name = "Fingerless Gloves"
path = /obj/item/clothing/gloves/fingerless
@@ -27,25 +27,32 @@
/datum/gear/shoes/cowboyboots
display_name = "cowboy boots, brown"
cost = 1
path = /obj/item/clothing/shoes/cowboy
/datum/gear/shoes/cowboyboots_black
display_name = "cowboy boots, black"
cost = 1
path = /obj/item/clothing/shoes/cowboy/black
/datum/gear/shoes/cowboyboots/white
display_name = "cowboy boots, white"
cost = 1
path = /obj/item/clothing/shoes/cowboy/white
/datum/gear/shoes/cowboyboots/pink
display_name = "cowboy boots, pink"
cost = 1
path = /obj/item/clothing/shoes/cowboy/pink
/datum/gear/shoes/laceup
display_name = "laceup shoes"
cost = 1
path = /obj/item/clothing/shoes/laceup
/datum/gear/shoes/blackshoes
display_name = "Black shoes"
path = /obj/item/clothing/shoes/black
/datum/gear/shoes/brownshoes
display_name = "Brown shoes"
path = /obj/item/clothing/shoes/brown
/datum/gear/shoes/whiteshoes
display_name = "White shoes"
path = /obj/item/clothing/shoes/white
@@ -1,7 +1,6 @@
/datum/gear/suit
subtype_path = /datum/gear/suit
slot = slot_wear_suit
cost = 2
sort_category = "External Wear"
//WINTER COATS
@@ -105,6 +104,10 @@
path = /obj/item/clothing/suit/armor/secjacket
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
/datum/gear/suit/ianshirt
display_name = "Ian Shirt"
path = /obj/item/clothing/suit/ianshirt
/datum/gear/suit/poncho
display_name = "poncho, classic"
path = /obj/item/clothing/suit/poncho
@@ -2,7 +2,6 @@
/datum/gear/uniform
subtype_path = /datum/gear/uniform
slot = slot_w_uniform
cost = 2
sort_category = "Uniforms and Casual Dress"
/datum/gear/uniform/skirt
+4 -3
View File
@@ -444,7 +444,8 @@ BLIND // can't see anything
slowdown = SHOES_SLOWDOWN
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/shoes.dmi'
"Vox" = 'icons/mob/species/vox/shoes.dmi',
"Drask" = 'icons/mob/species/drask/shoes.dmi'
)
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
@@ -595,7 +596,7 @@ BLIND // can't see anything
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
flash_protect = 2
strip_delay = 50
put_on_delay = 50
@@ -623,7 +624,7 @@ BLIND // can't see anything
put_on_delay = 80
burn_state = FIRE_PROOF
hide_tail_by_species = null
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
//Under clothing
/obj/item/clothing/under
+56 -2
View File
@@ -14,7 +14,7 @@
actions_types = list(/datum/action/item_action/toggle_helmet_light)
//Species-specific stuff.
species_restricted = list("exclude","Diona","Wryn")
species_restricted = list("exclude","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
@@ -93,9 +93,10 @@
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
actions_types = list(/datum/action/item_action/toggle_helmet)
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
var/obj/item/tank/jetpack/suit/jetpack = null
hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
species_restricted = list("exclude","Diona","Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
@@ -112,10 +113,59 @@
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi'
)
/obj/item/clothing/suit/space/hardsuit/New()
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
..()
/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
..()
/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/tank/jetpack/suit))
if(jetpack)
to_chat(user, "<span class='warning'>[src] already has a jetpack installed.</span>")
return
if(src == user.get_item_by_slot(slot_wear_suit)) //Make sure the player is not wearing the suit before applying the upgrade.
to_chat(user, "<span class='warning'>You cannot install the upgrade to [src] while wearing it.</span>")
return
if(user.unEquip(I))
I.forceMove(src)
jetpack = I
to_chat(user, "<span class='notice'>You successfully install the jetpack into [src].</span>")
return
else if(isscrewdriver(I))
if(!jetpack)
to_chat(user, "<span class='warning'>[src] has no jetpack installed.</span>")
return
if(src == user.get_item_by_slot(slot_wear_suit))
to_chat(user, "<span class='warning'>You cannot remove the jetpack from [src] while wearing it.</span>")
return
jetpack.turn_off(user)
jetpack.forceMove(drop_location())
jetpack = null
to_chat(user, "<span class='notice'>You successfully remove the jetpack from [src].</span>")
return
return ..()
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
..()
if(jetpack)
if(slot == slot_wear_suit)
for(var/X in jetpack.actions)
var/datum/action/A = X
A.Grant(user)
/obj/item/clothing/suit/space/hardsuit/dropped(mob/user)
..()
if(jetpack)
for(var/X in jetpack.actions)
var/datum/action/A = X
A.Remove(user)
/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_wear_suit) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit.
return 1
@@ -178,6 +228,7 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
jetpack = /obj/item/tank/jetpack/suit
//Mining hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/mining
@@ -291,6 +342,7 @@
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/tank/jetpack/suit
/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
@@ -438,6 +490,7 @@
icon_state = "hardsuit-hos"
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
jetpack = /obj/item/tank/jetpack/suit
sprite_sheets = null
//Singuloth armor
@@ -522,6 +575,7 @@
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
slowdown = 0
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
jetpack = /obj/item/tank/jetpack/suit
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
@@ -7,7 +7,7 @@
flags_inv = HIDEFACE
permeability_coefficient = 0.01
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
@@ -31,7 +31,7 @@
w_class = WEIGHT_CLASS_BULKY
allowed = list(/obj/item/tank, /obj/item/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -72,7 +72,7 @@
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/tank,/obj/item/kitchen/knife/combat)
armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
strip_delay = 120
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -159,7 +159,7 @@
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
@@ -180,7 +180,7 @@
item_state = "paramedic-eva"
desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
@@ -200,7 +200,7 @@
item_state = "s_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
@@ -223,7 +223,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
species_restricted = list("exclude", "Diona", "Wryn")
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
@@ -244,7 +244,7 @@
desc = ". . ."
icon_state = "spacemimehelmet"
item_state = "spacemimehelmet"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
sprite_sheets_obj = null
@@ -254,7 +254,7 @@
desc = ". . ."
icon_state = "spacemime_suit"
item_state = "spacemime_items"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
sprite_sheets_obj = null
@@ -264,7 +264,7 @@
desc = "An EVA helmet specifically designed for the clown. SPESSHONK!"
icon_state = "clownhelmet"
item_state = "clownhelmet"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
sprite_sheets_obj = null
@@ -274,7 +274,6 @@
desc = "An EVA suit specifically designed for the clown. SPESSHONK!"
icon_state = "spaceclown_suit"
item_state = "spaceclown_items"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
sprite_sheets_obj = null
@@ -758,6 +758,7 @@
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
actions_types = list(/datum/action/item_action/zipper)
adjust_flavour = "unzip"
+2 -1
View File
@@ -6,7 +6,8 @@
/obj/item/clothing/suit/space/hardsuit/Destroy()
if(helmet)
helmet.suit = null
qdel(helmet)
QDEL_NULL(helmet)
QDEL_NULL(jetpack)
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
+11 -11
View File
@@ -1212,16 +1212,16 @@
//////////// Sets ////////////
// Fox P McCloud: Fox McCloud
/obj/item/clothing/suit/jacket/fluff/fox
/obj/item/clothing/suit/storage/fox
name = "Aeronautics Jacket"
desc = "An aviator styled jacket made from a peculiar material; this one seems very old."
icon = 'icons/obj/custom_items.dmi'
icon_state = "fox_jacket"
item_state = "fox_jacket"
ignore_suitadjust = TRUE
actions_types = list()
adjust_flavour = null
sprite_sheets = null
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/projectile/automatic/pistol, /obj/item/gun/projectile/revolver, /obj/item/gun/projectile/revolver/detective)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
/obj/item/clothing/under/fluff/fox
name = "Aeronautics Jumpsuit"
@@ -1232,6 +1232,12 @@
item_color = "fox_suit"
displays_id = FALSE //still appears on examine; this is pure fluff.
/obj/item/clothing/suit/storage/fox/miljacket_desert
name = "rugged military jacket"
desc = "A rugged brown military jacket with a stylized 'A' embroidered on the back. It seems very old, yet is in near mint condition. Has a tag on the inside collar signed 'Fox McCloud'."
icon_state = "fox_coat"
item_color = "fox_coat"
/obj/item/toy/plushie/fluff/fox
name = "orange fox plushie"
desc = "A cute, soft, fuzzy, fluffy, and cuddly plushie. This has a small tag on it that is signed 'Fox McCloud'."
@@ -1262,12 +1268,6 @@
/obj/item/toy/plushie/fluff/fox/ui_action_click()
change_color()
/obj/item/clothing/suit/jacket/miljacket/desert/fox
name = "rugged military jacket"
desc = "A rugged brown military jacket with a stylized 'A' embroidered on the back. It seems very old, yet is in near mint condition. Has a tag on the inside collar signed 'Fox McCloud'."
icon = 'icons/obj/custom_items.dmi'
icon_state = "fox_coat"
item_color = "fox_coat"
// TheFlagbearer: Willow Walker
/obj/item/clothing/under/fluff/arachno_suit
+1 -1
View File
@@ -88,7 +88,7 @@
make_podman = 0
if(make_podman) //all conditions met!
var/mob/living/carbon/human/diona/podman = new /mob/living/carbon/human/diona(parent.loc)
var/mob/living/carbon/human/pod_diona/podman = new /mob/living/carbon/human/pod_diona(parent.loc)
if(realName)
podman.real_name = realName
mind.transfer_to(podman)
+1 -1
View File
@@ -37,7 +37,7 @@
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
+2 -2
View File
@@ -44,8 +44,8 @@
/obj/structure/closet/secure_closet/miner/New()
..()
// new /obj/item/stack/sheet/mineral/sandbags(src, 5)
// new /obj/item/storage/box/emptysandbags(src)
new /obj/item/stack/sheet/mineral/sandbags(src, 5)
new /obj/item/storage/box/emptysandbags(src)
new /obj/item/shovel(src)
new /obj/item/pickaxe/mini(src)
new /obj/item/radio/headset/headset_cargo/mining(src)
@@ -106,6 +106,9 @@
/mob/living/carbon/human/diona/Initialize(mapload)
..(mapload, /datum/species/diona)
/mob/living/carbon/human/pod_diona/Initialize(mapload)
..(mapload, /datum/species/diona/pod)
/mob/living/carbon/human/machine/Initialize(mapload)
..(mapload, /datum/species/machine)
@@ -11,10 +11,11 @@
//Do we have a working jetpack?
var/obj/item/tank/jetpack/thrust
if(istype(back,/obj/item/tank/jetpack))
if(istype(back, /obj/item/tank/jetpack))
thrust = back
else if(istype(s_store,/obj/item/tank/jetpack))
thrust = s_store
else if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
thrust = C.jetpack
else if(istype(back,/obj/item/rig))
var/obj/item/rig/rig = back
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
@@ -7,21 +7,11 @@
speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
speech_chance = 20
unarmed_type = /datum/unarmed_attack/diona
//primitive_form = "Nymph"
slowdown = 5
remains_type = /obj/effect/decal/cleanable/ash
warning_low_pressure = 50
hazard_low_pressure = -1
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 300
heat_level_2 = 340
heat_level_3 = 400
burn_mod = 1.25
heatmod = 1.5
var/pod = FALSE //did they come from a pod? If so, they're stronger than normal Diona.
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -31,16 +21,14 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
dies_at_threshold = TRUE
species_traits = list(IS_PLANT)
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
dietflags = DIET_HERB //Diona regenerate nutrition in light and water, no diet necessary, but if they must, they eat other plants *scream
taste_sensitivity = TASTE_SENSITIVITY_DULL
skinned_type = /obj/item/stack/sheet/wood
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
blood_color = "#004400"
flesh_color = "#907E4A"
butt_sprite = "diona"
@@ -49,6 +37,7 @@
has_organ = list(
"nutrient channel" = /obj/item/organ/internal/liver/diona,
"respiratory vacuoles" = /obj/item/organ/internal/lungs/diona,
"neural strata" = /obj/item/organ/internal/heart/diona,
"receptor node" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2.
"gas bladder" = /obj/item/organ/internal/brain/diona,
@@ -85,29 +74,47 @@
..()
H.gender = NEUTER
/datum/species/diona/handle_life(mob/living/carbon/human/H)
H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time.
var/rads = H.radiation / 25
H.radiation = max(H.radiation-rads, 0)
H.nutrition = min(H.nutrition+rads, NUTRITION_LEVEL_WELL_FED+10)
H.adjustBruteLoss(-(rads))
H.adjustToxLoss(-(rads))
/datum/species/diona/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "glyphosate" || R.id == "atrazine")
H.adjustToxLoss(3) //Deal aditional damage
return TRUE
return ..()
/datum/species/diona/handle_life(mob/living/carbon/human/H)
if(H.stat == DEAD)
return
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights
H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10)
light_amount = min(1, T.get_lumcount()) - 0.5
if(light_amount > 0)
H.clear_alert("nolight")
else
H.throw_alert("nolight", /obj/screen/alert/nolight)
H.nutrition += light_amount * 10
if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL)
H.nutrition = NUTRITION_LEVEL_ALMOST_FULL
if(light_amount > 0.2 && !H.suiciding) //if there's enough light, heal
if(!pod && H.health <= 0)
return
H.adjustBruteLoss(-1)
H.adjustFireLoss(-1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
if(light_amount > 0)
H.clear_alert("nolight")
else
H.throw_alert("nolight", /obj/screen/alert/nolight)
if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal
H.adjustBruteLoss(-(light_amount/2))
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
H.adjustBruteLoss(2)
..()
/datum/species/diona/pod //Same name and everything; we want the same limitations on them; we just want their regeneration to kick in at all times and them to have special factions
pod = TRUE
/datum/species/diona/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
C.faction |= "vines"
/datum/species/diona/pod/on_species_loss(mob/living/carbon/C)
. = ..()
C.faction -= "plants"
C.faction -= "vines"
+7
View File
@@ -70,6 +70,13 @@
if(!silent && !isnull(usr))
log_and_message_admins("cleared the supplied laws of [src]")
/mob/living/silicon/proc/clear_zeroth_law(var/silent = FALSE)
throw_alert("newlaw", /obj/screen/alert/newlaw)
laws_sanity_check()
laws.clear_zeroth_laws()
if(!silent && !isnull(usr))
log_and_message_admins("cleared the zeroth law of [src]")
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws)
var/prefix = ""
if(MAIN_CHANNEL == lawchannel)
@@ -0,0 +1,49 @@
/mob/living/simple_animal/hostile/skeleton
name = "reanimated skeleton"
desc = "A real bonefied skeleton, doesn't seem like it wants to socialize."
icon = 'icons/mob/animal.dmi'
icon_state = "skeleton"
icon_living = "skeleton"
turns_per_move = 5
speak_emote = list("rattles")
emote_see = list("rattles")
a_intent = INTENT_HARM
maxHealth = 40
health = 40
speed = 1
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
minbodytemp = 0
maxbodytemp = 1500
healable = FALSE //they're skeletons how would bruise packs help them??
attacktext = "slashes"
attack_sound = 'sound/hallucinations/growl1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
robust_searching = 1
stat_attack = UNCONSCIOUS
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
faction = list("skeleton")
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
deathmessage = "collapses into a pile of bones!"
del_on_death = TRUE
loot = list(/obj/effect/decal/remains/human)
/mob/living/simple_animal/hostile/skeleton/eskimo
name = "undead eskimo"
desc = "The reanimated remains of some poor traveler."
icon_state = "eskimo"
icon_living = "eskimo"
maxHealth = 55
health = 55
weather_immunities = list("snow")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
melee_damage_lower = 17
melee_damage_upper = 20
deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
loot = list(/obj/effect/decal/remains/human,
/obj/item/twohanded/spear,
/obj/item/clothing/shoes/winterboots,
/obj/item/clothing/suit/hooded/wintercoat)
+7 -1
View File
@@ -184,8 +184,10 @@
var/randomize = pick("robot", "slime", "xeno", "human", "animal")
switch(randomize)
if("robot")
var/path
if(prob(30))
new_mob = new /mob/living/silicon/robot/syndicate(M.loc)
path = pick(typesof(/mob/living/silicon/robot/syndicate))
new_mob = new path(M.loc)
else
new_mob = new /mob/living/silicon/robot(M.loc)
new_mob.gender = M.gender
@@ -193,6 +195,10 @@
new_mob.job = "Cyborg"
var/mob/living/silicon/robot/Robot = new_mob
Robot.mmi = new /obj/item/mmi(new_mob)
Robot.lawupdate = FALSE
Robot.connected_ai = null
Robot.clear_inherent_laws()
Robot.clear_zeroth_law()
if(ishuman(M))
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
if("slime")
@@ -143,7 +143,6 @@
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
M.visible_message("<span class='warning'>[M] writhes in pain as [M.p_their()] vacuoles boil.</span>", "<span class='userdanger'>You writhe in pain as your vacuoles boil!</span>", "<span class='italics'>You hear the crunching of leaves.</span>")
if(prob(35))
if(prob(80))
randmutb(M)
domutcheck(M,null)
@@ -988,10 +988,10 @@
C.adjustToxLoss(lethality)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(IS_PLANT in H.dna.species.species_traits) //plantmen take a LOT of damage
H.adjustToxLoss(50)
if(IS_PLANT in H.dna.species.species_traits) //plantmen take extra damage
H.adjustToxLoss(3)
..()
else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
else if(istype(M, /mob/living/simple_animal/diona)) //nymphs take EVEN MORE damage
var/mob/living/simple_animal/diona/D = M
D.adjustHealth(100)
..()
@@ -9,7 +9,7 @@
righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi'
icon_state = "ivbag"
volume = 200
possible_transfer_amounts = list(1,5,10)
possible_transfer_amounts = list(1,5,10,15,20,25,30,50) // Everything above 10 is NOT usable on a person and is instead used for transfering to other containers
amount_per_transfer_from_this = 1
container_type = OPENCONTAINER
var/label_text
@@ -53,6 +53,11 @@
end_processing()
return
if(amount_per_transfer_from_this > 10) // Prevents people from switching to illegal transfer values while the IV is already in someone, i.e. anything over 10
visible_message("<span class='danger'>The IV bag's needle pops out of [injection_target]'s arm. The transfer amount is too high!</span>")
end_processing()
return
if(get_dist(get_turf(src), get_turf(injection_target)) > 1)
to_chat(injection_target, "<span class='userdanger'>The [src]'s' needle is ripped out of you!</span>")
injection_target.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
@@ -98,6 +103,9 @@
else // Inserting the needle
if(!L.can_inject(user, 1))
return
if(amount_per_transfer_from_this > 10) // We only want to be able to transfer 1, 5, or 10 units to people. Higher numbers are for transfering to other containers
to_chat(user, "<span class='warning'>The IV bag can only be used on someone with a transfer amount of 1, 5 or 10.</span>")
return
if(L != user)
L.visible_message("<span class='danger'>[user] is trying to insert [src]'s needle into [L]'s arm!</span>", \
"<span class='userdanger'>[user] is trying to insert [src]'s needle into [L]'s arm!</span>")
@@ -107,6 +115,22 @@
"<span class='userdanger'>[user] inserts [src]'s needle into [L]'s arm!</span>")
begin_processing(L)
else if(target.is_refillable() && is_drainable()) // Transferring from IV bag to other containers
if(!reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty.</span>")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
to_chat(user, "<span class='warning'>[target] is full.</span>")
return
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You transfer [trans] units of the solution to [target].</span>")
else if(istype(target, /obj/item/reagent_containers/glass) && !target.is_open_container())
to_chat(user, "<span class='warning'>You cannot fill [target] while it is sealed.</span>")
return
/obj/item/reagent_containers/iv_bag/update_icon()
overlays.Cut()
@@ -0,0 +1,7 @@
//lavaland clown planet papers
/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape
info = "If you dare not continue down this path of madness, escape can be found through the chute in this room."
/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope
info = "Abandon hope, all ye who enter here."
@@ -17,7 +17,7 @@
density = TRUE
roundstart = FALSE
death = FALSE
mob_species = /datum/species/diona
mob_species = /datum/species/diona/pod
flavour_text = "<span class='big bold'>You are a sentient ecosystem,</span><b> an example of the mastery over life that your creators possessed. Your masters, benevolent as they were, created uncounted \
seed vaults and spread them across the universe to every planet they could chart. You are in one such seed vault. Your goal is to cultivate and spread life wherever it will go while waiting \
for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago.</b>"
+5 -11
View File
@@ -2,7 +2,6 @@
name = "core trunk"
max_damage = 200
min_broken_damage = 50
cannot_break = 1
amputation_point = "trunk"
encased = null
gendered_icon = 0
@@ -10,7 +9,6 @@
/obj/item/organ/external/groin/diona
name = "fork"
min_broken_damage = 50
cannot_break = 1
amputation_point = "lower trunk"
gendered_icon = 0
@@ -18,58 +16,49 @@
name = "left upper tendril"
max_damage = 35
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper left trunk"
/obj/item/organ/external/arm/right/diona
name = "right upper tendril"
max_damage = 35
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper right trunk"
/obj/item/organ/external/leg/diona
name = "left lower tendril"
max_damage = 35
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower left fork"
/obj/item/organ/external/leg/right/diona
name = "right lower tendril"
max_damage = 35
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower right fork"
/obj/item/organ/external/foot/diona
name = "left foot"
max_damage = 20
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
/obj/item/organ/external/foot/right/diona
name = "right foot"
max_damage = 20
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
/obj/item/organ/external/hand/diona
name = "left grasper"
cannot_break = 1
amputation_point = "branch"
/obj/item/organ/external/hand/right/diona
name = "right grasper"
cannot_break = 1
amputation_point = "branch"
/obj/item/organ/external/head/diona
max_damage = 50
min_broken_damage = 25
cannot_break = 1
encased = null
amputation_point = "upper trunk"
gendered_icon = 0
@@ -82,6 +71,11 @@
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
/obj/item/organ/internal/lungs/diona
name = "respiratory vacuoles"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
name = "gas bladder"
icon = 'icons/obj/objects.dmi'
+2
View File
@@ -5,6 +5,8 @@
##BIODOMES
#_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
#_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
#_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_winter.dmm
##RESPAWN
#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -0,0 +1,20 @@
author: "Arkatos"
delete-after: True
changes:
- imageadd: "Added new icon for Charge spell"
- imageadd: "Added new icon for No Clothes spell"
- imageadd: "Added new icon for Wizard spellbook"
- imageadd: "Added new animations to 10 single-use spellbooks"
- imageadd: "Added new sprite for Bottle of Tickles"
- rscadd: "Added refunding functionality to the Bottle of Ooze akin to the other summoning bottles. Click with the bottle in hand on a wizard spellbook to refund its cost and limit slot."
- bugfix: "Fixed an issue where Bottle of Tickles did not properly refund"
- bugfix: "Fixed an issue with alpha layering on Bottle of Ooze sprite"
- tweak: "Very slightly adjusted brightness of the Boo! ghost spell icon"
- tweak: "Wizard spellbook was completely reorganized, and new appropriate categories were added, each category is sorted by price, and if price of the two or more spells is the same, they are sorted alphabetically"
- tweak: "Polymorph can now turn a mob into Syndicate medical or saboteur modules"
- tweak: "Mobs made via polymorph into borgs are now unbounded free borgs"
- tweak: "Repulse spell cost decreased from 2 to 1"
- tweak: "Lighting bolt spell cost decreased from 2 to 1"
- tweak: "Slaughter/Laughter demons and Magical Morphs now always have their second fluff objective considered as complete no matter the circumstances"
- tweak: "Laughter Demons very slightly buffed, they are still a bit weaker than Slaughter Demons"
- spellcheck: "Improved descriptions and wording regarding Wizard spellbook and Wizard spells"
@@ -0,0 +1,15 @@
author: "Fox McCloud"
delete-after: True
changes:
- tweak: "Reworks Diona"
- rscadd: "Diona bleed (call it chlorophy; it's green)"
- rscadd: "Diona Breathe (plants do need to exchange gas after all)"
- rscdel: "Rad Immunity Removed"
- tweak: "Diona regenerate 1 OXY, 1 BURN, 1 BRUTE, and 1 TOX if they are in a bright area; this effect does not kick in if they're in crit"
- rscdel: "Diona no longer have unbreakable bones (wood can crack ya know!)"
- rscdel: "Diona are no longer space proof"
- tweak: "Diona are more vulnerable to fire and heat damage"
- tweak: "Diona weakness to weedkiller dramatically nerfed"
- rscadd: "Diona now use Newcrit"
- tweak: "Diona are no longer slow"
- rscadd: "Diona can wear spacesuits"
@@ -0,0 +1,4 @@
author: "datlo"
delete-after: True
changes:
- rscadd: "Added the Clown and Winter biodomes as possible lavaland ruins."
@@ -0,0 +1,4 @@
author: "SteelSlayer"
delete-after: True
changes:
- tweak: "IV bags are able to transfer their contents to other containers by clicking on them with the bag"
@@ -0,0 +1,4 @@
author: "SteelSlayer"
delete-after: True
changes:
- rscadd: "Adds a handheld defibrillator to the paramedic EVA closet"
@@ -0,0 +1,5 @@
author: "SteelSlayer"
delete-after: True
changes:
- rscdel: "Removed one of the high capacity tanks in hydroponics"
- rscadd: "Added a disk compartmentalizer to hydroponics"
@@ -0,0 +1,4 @@
author: "Shadow-Quill"
delete-after: True
changes:
- bugfix: "Fixed being able to talk in OOC under certain circumstances if it's disabled."
@@ -0,0 +1,4 @@
author: "Kurgis"
delete-after: True
changes:
- rscadd: "Beepsky now bumps around on its wheels when patrolling for crime."
@@ -0,0 +1,7 @@
author: "Fox McCloud"
delete-after: True
changes:
- rscadd: "Adds jetpack hardsuit upgrades: get yours at mining for 2000 points"
- rscdel: "Removes mining carbon dioxide jetpack"
- tweak: "Can no longer use jetpacks in your suit storage slot"
- rscadd: "Chief Engineer's hardsuit, Syndicate Hardsuit (normal and elite), and Shielded Syndicate Hardsuit all have built in jetpacks"
@@ -0,0 +1,6 @@
author: "Fox McCloud"
delete-after: True
changes:
- tweak: "loadout costs for most things cut from 2 to 1"
- rscadd: "Adds fingerless gloves, eyepatch, prescription glasses, black shoes, brown shoes, white shoes, and ian's shirt to the loadout"
- tweak: "moved hipster glasses from donator to general glasses"
@@ -0,0 +1,7 @@
author: "Fox McCloud"
delete-after: True
changes:
- rscadd: "Adds in sandbags. Use them to deploy destructable barriers; miners start off with a few"
- rscdel: "Removes access based security barriers"
- rscadd: "Adds in security barrier grenade. When it goes off, it will deploy up to 3 barriers that will lock into place; should find 4 of these in the armory"
- rscadd: "can tear up bedsheet and gauze to get cloth--requires a sharp object"
@@ -0,0 +1,5 @@
author: "Ionward"
delete-after: True
changes:
- imageadd: "Drask crewmembers now have properly fitting shoes."
- imageadd: "Fixed some minor issues in Drasks uniforms"
@@ -0,0 +1,4 @@
author: "Fox McCloud"
delete-after: True
changes:
- bugfix: "Unironically fixes about several thousand runtimes"
@@ -0,0 +1,4 @@
author: "Fox McCloud"
delete-after: True
changes:
- bugfix: "Fixes jackets not keeping you warm"
@@ -0,0 +1,4 @@
author: "variableundefined"
delete-after: True
changes:
- tweak: "A proc's name got changed. That's it"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 KiB

After

Width:  |  Height:  |  Size: 323 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

+4
View File
@@ -1324,6 +1324,8 @@
#include "code\modules\client\preference\loadout\loadout_cosmetics.dm"
#include "code\modules\client\preference\loadout\loadout_donor.dm"
#include "code\modules\client\preference\loadout\loadout_general.dm"
#include "code\modules\client\preference\loadout\loadout_glasses.dm"
#include "code\modules\client\preference\loadout\loadout_gloves.dm"
#include "code\modules\client\preference\loadout\loadout_hat.dm"
#include "code\modules\client\preference\loadout\loadout_racial.dm"
#include "code\modules\client\preference\loadout\loadout_shoes.dm"
@@ -1959,6 +1961,7 @@
#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
#include "code\modules\mob\living\simple_animal\hostile\spaceworms.dm"
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
@@ -2339,6 +2342,7 @@
#include "code\modules\ruins\ruin_areas.dm"
#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm"
#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm"
#include "code\modules\ruins\lavalandruin_code\clown_planet.dm"
#include "code\modules\ruins\lavalandruin_code\dead_ratvar.dm"
#include "code\modules\ruins\lavalandruin_code\fountain_hall.dm"
#include "code\modules\ruins\lavalandruin_code\hermit.dm"