Merge remote-tracking branch 'origin/master' into what-should-i-name-this-branch

This commit is contained in:
LetterN
2021-12-21 07:59:33 +08:00
164 changed files with 128258 additions and 912 deletions
+175
View File
@@ -0,0 +1,175 @@
/area/edina
name = "Nova Edina wilderness"
icon_state = "edina"
has_gravity = STANDARD_GRAVITY
clockwork_warp_allowed = FALSE // Can servants warp into this area from Reebe?
clockwork_warp_fail = "The aurora borealis is interfering with your teleport! Try somewhere closer to the city."
always_unpowered = TRUE
//dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
power_light = FALSE
power_equip = FALSE
power_environ = FALSE
outdoors = TRUE
//ambientsounds = SPACE //For later
/area/edina/backstreet
name = "Nova Edina backstreets"
icon_state = "edina_alley"
clockwork_warp_allowed = TRUE
ambientsounds = MAINTENANCE
always_unpowered = FALSE //Sure you can have power if you want
/area/edina/backstreet/supply
name = "Supply Backstreets"
icon_state = "edina_alley"
clockwork_warp_allowed = TRUE
ambientsounds = MAINTENANCE
always_unpowered = FALSE //Sure you can have power if you want
/area/edina/backstreet/research
name = "Research Backstreets"
icon_state = "edina_alley"
clockwork_warp_allowed = TRUE
ambientsounds = MAINTENANCE
always_unpowered = FALSE //Sure you can have power if you want
/area/edina/backstreet/med
name = "Hospital Backstreets"
icon_state = "edina_alley"
clockwork_warp_allowed = TRUE
ambientsounds = MAINTENANCE
always_unpowered = FALSE //Sure you can have power if you want
///Nova Edina Streets///
/area/edina/street
name = "Nova Edina Streets"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
always_unpowered = FALSE //Sure you can have power if you want
/area/edina/street/primary
name = "Nova Edina Streets"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
/area/edina/street/primary/princess
name = "Princess Street"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
/area/edina/street/primary/progress
name = "Progress Street"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
/area/edina/street/primary/perimeter
name = "Perimeter Way"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
/area/edina/street/primary/servitor
name = "Servitor Street"
icon_state = "edina_street"
ambientsounds = null //TODO:add ?
/area/edina/street/secondary
name = "Nova Edina Streets"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/secondary/command
name = "Command Court"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/secondary/supply
name = "Supply Street"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/secondary/castle
name = "Castle Way"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/secondary/aux
name = "Auxiliary Avenue"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection
name = "Nova Edina Streets"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/princessprogress
name = "Princess & Progress"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/princessperimeter
name = "Princess & Perimeter"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/princessperimeter/north
name = "Perimeter & N Princess"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/princessperimeter/south
name = "Perimeter & S Princess"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/princessservitor
name = "Servitor & Princess"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/servsuppaux
name = "Servitor, Supply, & Auxiliary"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/intersection/progcastaux
name = "Progress, Castle, & Auxiliary"
icon_state = "edina_street2"
ambientsounds = null //TODO:add ?
/area/edina/street/street2 //Just so laying areas is easier
icon_state = "edina_street2"
/area/edina/protected //Prevents ice storms
name = "Sheltered Nova Edina"
/////////////////Edina specific derivitives///////////////////////////////////
/area/edina/crew_quarters
clockwork_warp_allowed = TRUE
area_flags = BLOBS_ALLOWED | VALID_TERRITORY
/area/edina/crew_quarters/holo_atrium
name = "Hologram atrium"
/area/edina/crew_quarters/store/clothes
name = "Clothes Store"
/area/edina/crew_quarters/store/plushies
name = "Plushies Store"
/area/edina/crew_quarters/store/pet
name = "Pet Store"
////////////////Mapping helper/////////////////////////
/obj/effect/mapping_helpers/planet_z
name = "planet z helper"
layer = POINT_LAYER
/obj/effect/mapping_helpers/planet_z/Initialize()
. = ..()
var/datum/space_level/S = SSmapping.get_level(z)
S.traits["Planet"] = TRUE //This probably doesn't work as I expect. But maybe!!
@@ -382,6 +382,70 @@
else
return ..()
//////////////////////////////////////////////
// //
// Clock Cult (MID) //
// //
//////////////////////////////////////////////
//changes two people midround into clockwork cultists
/datum/dynamic_ruleset/midround/ratvar_awakening
name = "Ratvar Awakening"
antag_datum = /datum/antagonist/clockcult
antag_flag = "clock mid"
antag_flag_override = ROLE_SERVANT_OF_RATVAR
protected_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
enemy_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
required_enemies = list(1,1,1,1,1,1,0,0,0,0)
required_candidates = 2
weight = 3
cost = 20
requirements = list(101,101,101,101,50,40,30,20,10,10)
var/list/clock_cap = list(1,1,1,1,2,3,4,5,5,5)
flags = HIGH_IMPACT_RULESET
/datum/dynamic_ruleset/midround/ratvar_awakening/acceptable(population=0, threat=0)
if (locate(/datum/dynamic_ruleset/roundstart/clockcult) in mode.executed_rules)
return FALSE // Unavailable if clockies exist at round start
indice_pop = min(clock_cap.len, round(living_players.len/5)+1)
required_candidates = clock_cap[indice_pop]
return ..()
/datum/dynamic_ruleset/midround/ratvar_awakening/trim_candidates()
..()
candidates = living_players
for(var/mob/living/player as anything in candidates)
var/turf/player_turf = get_turf(player)
if(!player_turf || !is_station_level(player_turf.z))
candidates -= player //no ghost roles
continue
if(!is_eligible_servant(player))
candidates -= player
continue
if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0))
candidates -= player //no double dipping
/datum/dynamic_ruleset/midround/ratvar_awakening/execute()
if(!candidates || !candidates.len)
return FALSE
for(var/i = 0; i < required_candidates; i++)
if(!candidates.len)
break
var/mob/living/clock_antag = pick_n_take(candidates)
assigned += clock_antag.mind
for(var/datum/mind/M in assigned) //add them to the clockwork team
add_servant_of_ratvar(M.current)
SSticker.mode.equip_servant(M.current)
SSticker.mode.greet_servant(M.current)
message_admins("[ADMIN_LOOKUPFLW(M.current)] was selected by the [name] ruleset and has been made into a midround clock cultist.")
log_game("DYNAMIC: [key_name(M.current)] was selected by the [name] ruleset and has been made into a midround clock cultist.")
load_reebe()
return ..()
//////////////////////////////////////////////
// //
// BLOB (GHOST) //
+25
View File
@@ -103,6 +103,31 @@ GLOBAL_LIST_INIT(dye_registry, list(
DYE_RD = /obj/item/bedsheet/rd,
DYE_CMO = /obj/item/bedsheet/cmo,
DYE_COSMIC = /obj/item/bedsheet/cosmos
),
DYE_REGISTRY_DOUBLE_BEDSHEET = list(
DYE_RED = /obj/item/bedsheet/red/double,
DYE_ORANGE = /obj/item/bedsheet/orange/double,
DYE_YELLOW = /obj/item/bedsheet/yellow/double,
DYE_GREEN = /obj/item/bedsheet/green/double,
DYE_BLUE = /obj/item/bedsheet/blue/double,
DYE_PURPLE = /obj/item/bedsheet/purple/double,
DYE_BLACK = /obj/item/bedsheet/black/double,
DYE_WHITE = /obj/item/bedsheet/double,
DYE_RAINBOW = /obj/item/bedsheet/rainbow/double,
DYE_MIME = /obj/item/bedsheet/mime/double,
DYE_CLOWN = /obj/item/bedsheet/clown/double,
DYE_CHAP = /obj/item/bedsheet/chaplain/double,
DYE_QM = /obj/item/bedsheet/qm/double,
DYE_LAW = /obj/item/bedsheet/black/double,
DYE_CAPTAIN = /obj/item/bedsheet/captain/double,
DYE_HOP = /obj/item/bedsheet/hop/double,
DYE_HOS = /obj/item/bedsheet/hos/double,
DYE_CE = /obj/item/bedsheet/ce/double,
DYE_RD = /obj/item/bedsheet/rd/double,
DYE_CMO = /obj/item/bedsheet/cmo/double,
DYE_COSMIC = /obj/item/bedsheet/cosmos/double,
DYE_SYNDICATE = /obj/item/bedsheet/syndie/double,
DYE_CENTCOM = /obj/item/bedsheet/centcom/double
)
))
+3
View File
@@ -344,6 +344,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
return ..()
/obj/item/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(!user)
return
if(anchored)
+2 -1
View File
@@ -467,7 +467,8 @@ GENETICS SCANNER
if(length(reagents))
msg += "<span class='notice'>Subject contains the following reagents:</span>\n"
for(var/datum/reagent/R in reagents)
msg += "<span class='notice'>[R.volume] units of [R.name][R.overdosed == 1 ? "</span> - <span class='boldannounce'>OVERDOSING</span>" : ".</span>"]\n"
var/invalid_reagent = is_reagent_processing_invalid(R, M)
msg += "<span class='notice'>[invalid_reagent ? "<font color='grey'>" : ""][R.volume] units of [R.name][invalid_reagent ? "</font>" : ""][R.overdosed == 1 ? "</span> - <span class='boldannounce'>OVERDOSING</span>" : ".</span>"]\n"
else
msg += "<span class='notice'>Subject contains no reagents.</span>\n"
@@ -59,9 +59,6 @@
I.play_tool_sound(src, 25)
else
to_chat(user, "<span class='warning'>You need to add at least one beaker before locking the [initial(name)] assembly!</span>")
else if(stage == READY && !nadeassembly)
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
to_chat(user, "<span class='notice'>You modify the time delay. It's set for [DisplayTimeText(det_time)].</span>")
else if(stage == EMPTY)
to_chat(user, "<span class='warning'>You need to add an activation mechanism!</span>")
+7 -7
View File
@@ -135,16 +135,16 @@
/obj/item/grenade/tool_act(mob/living/user, obj/item/I, tool_behaviour)
if(tool_behaviour == TOOL_SCREWDRIVER)
switch(det_time)
if ("1")
det_time = 10
if(1)
det_time = 1 SECONDS
to_chat(user, "<span class='notice'>You set the [name] for 1 second detonation time.</span>")
if ("10")
det_time = 30
if(1 SECONDS)
det_time = 3 SECONDS
to_chat(user, "<span class='notice'>You set the [name] for 3 second detonation time.</span>")
if ("30")
det_time = 50
if(3 SECONDS)
det_time = 5 SECONDS
to_chat(user, "<span class='notice'>You set the [name] for 5 second detonation time.</span>")
if ("50")
if(5 SECONDS)
det_time = 1
to_chat(user, "<span class='notice'>You set the [name] for instant detonation.</span>")
add_fingerprint(user)
+16 -10
View File
@@ -247,22 +247,28 @@
var/final_damage = damage
if(attack_type & ATTACK_TYPE_MELEE)
var/obj/hittingthing = object
if(hittingthing.damtype == BURN)
if((shield_flags & SHIELD_ENERGY_WEAK))
final_damage *= 2
else if((shield_flags & SHIELD_ENERGY_STRONG))
final_damage *= 0.5
if(istype(object, /obj)) //Assumption: non-object attackers are a meleeing mob. Therefore: Assuming physical attack in this case.
var/obj/hittingthing = object
if(hittingthing.damtype == BURN)
if((shield_flags & SHIELD_ENERGY_WEAK))
final_damage *= 2
else if((shield_flags & SHIELD_ENERGY_STRONG))
final_damage *= 0.5
if(hittingthing.damtype == BRUTE)
if(hittingthing.damtype == BRUTE)
if((shield_flags & SHIELD_KINETIC_WEAK))
final_damage *= 2
else if((shield_flags & SHIELD_KINETIC_STRONG))
final_damage *= 0.5
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
final_damage = 0
else
if((shield_flags & SHIELD_KINETIC_WEAK))
final_damage *= 2
else if((shield_flags & SHIELD_KINETIC_STRONG))
final_damage *= 0.5
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
final_damage = 0
if(attack_type & ATTACK_TYPE_PROJECTILE)
var/obj/item/projectile/shootingthing = object
if(is_energy_reflectable_projectile(shootingthing))
@@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \
//CIT CHANGE - adds sofas to metal recipe list
new/datum/stack_recipe_list("sofas", list( \
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
@@ -396,6 +397,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
new/datum/stack_recipe("padded floor tile", /obj/item/stack/tile/padded, 1, 4, 20), \
null, \
+7 -3
View File
@@ -368,12 +368,16 @@
if(ishuman(hit_atom) && !caught && prob(throw_hit_chance) && thrownby)//if they are a carbon and they didn't catch it
baton_stun(hit_atom, thrownby, shoving = TRUE)
if(thrownby && !caught)
sleep(1)
if(!QDELETED(src))
throw_at(thrownby, throw_range+2, throw_speed, null, TRUE)
throw_back()
else
return ..()
/obj/item/melee/baton/boomerang/proc/throw_back()
set waitfor = FALSE
sleep(1)
if(!QDELETED(src))
throw_at(thrownby, throw_range+2, throw_speed, null, TRUE)
/obj/item/melee/baton/boomerang/update_icon()
if(turned_on)
icon_state = "[initial(icon_state)]_active"
+16 -12
View File
@@ -271,18 +271,7 @@
if(resin_cooldown)
to_chat(user, "<span class='warning'>Resin launcher is still recharging...</span>")
return
resin_cooldown = TRUE
R.remove_any(100)
var/obj/effect/resin_container/A = new (get_turf(src))
log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
playsound(src,'sound/items/syringeproj.ogg',40,1)
for(var/a=0, a<5, a++)
step_towards(A, target)
sleep(2)
A.Smoke()
spawn(100)
if(src)
resin_cooldown = FALSE
launch_resin(target, user)
return
if(nozzle_mode == RESIN_FOAM)
if(!Adj|| !isturf(target))
@@ -301,6 +290,21 @@
to_chat(user, "<span class='warning'>Resin foam mix is still being synthesized...</span>")
return
/obj/item/extinguisher/mini/nozzle/proc/launch_resin(atom/target, mob/user)
set waitfor = FALSE
resin_cooldown = TRUE
reagents.remove_any(100)
var/obj/effect/resin_container/A = new (get_turf(src))
log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
playsound(src,'sound/items/syringeproj.ogg',40,1)
for(var/a=0, a<5, a++)
step_towards(A, target)
sleep(2)
A.Smoke()
spawn(100)
if(src)
resin_cooldown = FALSE
/obj/effect/resin_container
name = "resin container"
desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches."
+31
View File
@@ -383,3 +383,34 @@
/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
return
//For returning special data when the object is saved
//For example, or silos will return a list of their materials which will be dumped on top of them
//Can be customised if you have something that contains something you want saved
//If you put an incorrect format it will break outputting, so don't use this if you don't know what you are doing
//NOTE: Contents is automatically saved, so if you store your things in the contents var, don't worry about this
//====Output Format Examples====:
//===Single Object===
// "/obj/item/folder/blue"
//===Multiple Objects===
// "/obj/item/folder/blue,\n
// /obj/item/folder/red"
//===Single Object with metadata===
// "/obj/item/folder/blue{\n
// \tdir = 8;\n
// \tname = "special folder"\n
// \t}"
//===Multiple Objects with metadata===
// "/obj/item/folder/blue{\n
// \tdir = 8;\n
// \tname = "special folder"\n
// \t},\n
// /obj/item/folder/red"
//====How to save easily====:
// return "[thing.type][generate_tgm_metadata(thing)]"
//Where thing is the additional thing you want to same (For example ores inside an ORM)
//Just add ,\n between each thing
//generate_tgm_metadata(thing) handles everything inside the {} for you
/obj/proc/on_object_saved(depth)
return ""
@@ -53,6 +53,12 @@
else
return ..()
/obj/structure/bed/post_buckle_mob(mob/living/target)
target.pixel_y = target.get_standard_pixel_y_offset(TRUE)
/obj/structure/bed/double/post_unbuckle_mob(mob/living/target)
target.pixel_y = target.get_standard_pixel_y_offset(FALSE)
/*
* Roller beds
*/
@@ -214,3 +220,24 @@
name = "resting contraption"
desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
icon_state = "abed"
//Double Beds, for luxurious sleeping, i.e. the captain and maybe heads- Do use this for ERP
/obj/structure/bed/double
name = "double bed"
desc = "A luxurious double bed, for those too important for small dreams."
icon_state = "bed_double"
buildstackamount = 4
max_buckled_mobs = 2
///The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles.
var/mob/living/goldilocks
/obj/structure/bed/double/post_buckle_mob(mob/living/target)
target.pixel_y = target.get_standard_pixel_y_offset(TRUE)
if(buckled_mobs.len > 1 && !goldilocks) //Push the second buckled mob a bit higher from the normal lying position
target.pixel_y = target.get_standard_pixel_y_offset(FALSE) + 6
goldilocks = target
/obj/structure/bed/double/post_unbuckle_mob(mob/living/target)
target.pixel_y = target.get_standard_pixel_y_offset(FALSE)
if(target == goldilocks)
goldilocks = null
+206 -4
View File
@@ -4,6 +4,41 @@ BEDSHEETS
LINEN BINS
*/
#define BEDSHEET_SINGLE "single"
#define BEDSHEET_DOUBLE "double"
GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double,
/obj/item/bedsheet/blue/double,
/obj/item/bedsheet/green/double,
/obj/item/bedsheet/grey/double,
/obj/item/bedsheet/orange/double,
/obj/item/bedsheet/purple/double,
/obj/item/bedsheet/patriot/double,
/obj/item/bedsheet/rainbow/double,
/obj/item/bedsheet/red/double,
/obj/item/bedsheet/yellow/double,
/obj/item/bedsheet/mime/double,
/obj/item/bedsheet/clown/double,
/obj/item/bedsheet/captain/double,
/obj/item/bedsheet/rd/double,
/obj/item/bedsheet/medical/double,
/obj/item/bedsheet/cmo/double,
/obj/item/bedsheet/hos/double,
/obj/item/bedsheet/hop/double,
/obj/item/bedsheet/ce/double,
/obj/item/bedsheet/qm/double,
/obj/item/bedsheet/chaplain/double,
/obj/item/bedsheet/brown/double,
/obj/item/bedsheet/black/double,
/obj/item/bedsheet/centcom/double,
/obj/item/bedsheet/syndie/double,
/obj/item/bedsheet/cult/double,
/obj/item/bedsheet/wiz/double,
/obj/item/bedsheet/nanotrasen/double,
/obj/item/bedsheet/ian/double,
/obj/item/bedsheet/cosmos/double
))
/obj/item/bedsheet
name = "bedsheet"
desc = "A surprisingly soft linen bedsheet."
@@ -21,10 +56,15 @@ LINEN BINS
dog_fashion = /datum/dog_fashion/head/ghost
var/list/dream_messages = list("white")
var/stack_amount = 3
var/bedsheet_type = BEDSHEET_SINGLE
/obj/item/bedsheet/Initialize(mapload)
. = ..()
AddElement(/datum/element/bed_tuckable, 0, 0, 0)
if(bedsheet_type == BEDSHEET_DOUBLE)
stack_amount *= 2
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
/obj/item/bedsheet/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
@@ -46,7 +86,7 @@ LINEN BINS
/obj/item/bedsheet/attackby(obj/item/I, mob/user, params)
if(!(flags_1 & HOLOGRAM_1) && (I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()))
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3)
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), stack_amount)
transfer_fingerprints_to(C)
C.add_fingerprint(user)
qdel(src)
@@ -247,9 +287,171 @@ LINEN BINS
/obj/item/bedsheet/random/Initialize()
..()
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable)))
new type(loc)
return INITIALIZE_HINT_QDEL
if(bedsheet_type == BEDSHEET_SINGLE)
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable) + GLOB.double_bedsheets))
new type(loc)
return INITIALIZE_HINT_QDEL
/obj/item/bedsheet/double
icon_state = "double_sheetwhite"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/blue/double
icon_state = "double_sheetblue"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/green/double
icon_state = "double_sheetgreen"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/grey/double
icon_state = "double_sheetgrey"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/orange/double
icon_state = "double_sheetorange"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/purple/double
icon_state = "double_sheetpurple"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/patriot/double
icon_state = "double_sheetUSA"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/rainbow/double
icon_state = "double_sheetrainbow"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/red/double
icon_state = "double_sheetred"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/yellow/double
icon_state = "double_sheetyellow"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/mime/double
icon_state = "double_sheetmime"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/clown/double
icon_state = "double_sheetclown"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/captain/double
icon_state = "double_sheetcaptain"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/rd/double
icon_state = "double_sheetrd"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/medical/double
icon_state = "double_sheetmedical"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/cmo/double
icon_state = "double_sheetcmo"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/hos/double
icon_state = "double_sheethos"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/hop/double
icon_state = "double_sheethop"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/ce/double
icon_state = "double_sheetce"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/qm/double
icon_state = "double_sheetqm"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/chaplain/double
icon_state = "double_sheetchap"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/brown/double
icon_state = "double_sheetbrown"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/black/double
icon_state = "double_sheetblack"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/centcom/double
icon_state = "double_sheetcentcom"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/syndie/double
icon_state = "double_sheetsyndie"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/cult/double
icon_state = "double_sheetcult"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/wiz/double
icon_state = "double_sheetwiz"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/nanotrasen/double
icon_state = "double_sheetNT"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/ian/double
icon_state = "double_sheetian"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/cosmos/double
icon_state = "double_sheetcosmos"
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/random/double
icon_state = "random_bedsheet"
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/random/double/Initialize()
..()
if(bedsheet_type == BEDSHEET_DOUBLE)
var/type = pick(GLOB.double_bedsheets)
new type(loc)
return INITIALIZE_HINT_QDEL
/obj/item/bedsheet/chameleon //donator chameleon bedsheet
name = "chameleon bedsheet"
@@ -672,3 +672,15 @@
if(allowed(user))
return TRUE
to_chat(user, "<span class='notice'>Access denied.</span>")
/obj/structure/closet/on_object_saved(depth)
if(depth >= 10)
return ""
var/dat = ""
for(var/obj/item in contents)
var/metadata = generate_tgm_metadata(item)
dat += "[dat ? ",\n" : ""][item.type][metadata]"
//Save the contents of things inside the things inside us, EG saving the contents of bags inside lockers
var/custom_data = item.on_object_saved(depth++)
dat += "[custom_data ? ",\n[custom_data]" : ""]"
return dat
+20 -1
View File
@@ -57,6 +57,7 @@
hole_size = LARGE_HOLE
/obj/structure/fence/attackby(obj/item/W, mob/user)
var/current_stage = hole_size
if(W.tool_behaviour == TOOL_WIRECUTTER)
if(!cuttable)
to_chat(user, "<span class='notice'>This section of the fence can't be cut.</span>")
@@ -64,7 +65,6 @@
if(invulnerable)
to_chat(user, "<span class='notice'>This fence is too strong to cut through.</span>")
return
var/current_stage = hole_size
if(current_stage >= MAX_HOLE_SIZE)
to_chat(user, "<span class='notice'>This fence has too much cut out of it already.</span>")
return
@@ -86,6 +86,25 @@
update_cut_status()
else if(istype(W, /obj/item/stack/rods) && broken)
if(!hole_size)
to_chat(user, "<span class='info'>The [src] has no cuts in it!</span>")
return
var/obj/item/stack/rods/R = W
if(do_after(user, CUT_TIME, target = src))
if(current_stage == hole_size)
switch(--hole_size)
if(NO_HOLE)
visible_message("<span class='notice'>\The [user] repairs \the [src] fully.</span>")
to_chat(user, "<span class='info'>You repaire the [src] back to it's former glory.</span>")
climbable = TRUE
if(MEDIUM_HOLE)
visible_message("<span class='notice'>\The [user] patches up \the [src].</span>")
to_chat(user, "<span class='info'>The hole in \the [src] is reduced slightly, though someone could probably sill squeeze though if you don't patch it up more.</span>")
climbable = FALSE
R.use(1)
update_cut_status()
return TRUE
/obj/structure/fence/proc/update_cut_status()
+6
View File
@@ -78,6 +78,12 @@
deconstructible = FALSE
layer = EDGED_TURF_LAYER
/obj/structure/fluff/lightpost/light
desc = "That which most enchants the Edinians is the lighting by gas of the boulevards... These humble rows of lamps, shining with a clarity white and pure, have a marvelous effect upon the streets on Nova Edina. Adorned with a cheery garb, in tune with the festive spirits of the city."
light_power = 0.8
light_range = 10
light_color = "#ffeeab"
/obj/structure/fluff/bus
name = "bus"
desc = "GO TO SCHOOL. READ A BOOK."