Merge pull request #15 from quotefox/master

update unga
This commit is contained in:
Chloe
2021-05-01 04:28:42 +01:00
committed by GitHub
133 changed files with 14196 additions and 4920 deletions
+1
View File
@@ -0,0 +1 @@
#define FORCE_MAP "_maps/layeniastation.json"
+16
View File
@@ -0,0 +1,16 @@
{
"map_name": "Layenia Station",
"map_path": "map_files/LayeniaStation",
"map_file": "LayeniaStation.dmm",
"shuttles": {
"cargo": "cargo_box",
"ferry": "ferry_fancy",
"whiteship": "whiteship_box",
"emergency": "emergency_box"
},
"traits":[
{
"Gravity":true
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+30 -21
View File
@@ -1,30 +1,39 @@
"a" = (/obj/machinery/door/airlock/titanium{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/supply) "a" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/obj/machinery/door/poddoor{dir = 8; id = "QMLoaddoor2"; name = "supply dock loading door"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/supply)
"b" = (/turf/closed/wall/mineral/titanium,/area/shuttle/supply) "b" = (/turf/closed/wall/mineral/titanium,/area/shuttle/supply)
"c" = (/obj/machinery/door/airlock/titanium{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/supply) "c" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/titanium{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/turf/open/floor/plating,/area/shuttle/supply)
"e" = (/turf/open/floor/mineral/titanium/blue,/area/shuttle/supply) "e" = (/obj/effect/turf_decal/stripes/line{dir = 9},/turf/open/floor/plasteel,/area/shuttle/supply)
"f" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "f" = (/obj/machinery/door/airlock/titanium{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/supply)
"h" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/obj/machinery/light{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/supply) "h" = (/obj/machinery/light{dir = 4},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/button/door{id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/open/floor/plasteel,/area/shuttle/supply)
"j" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "i" = (/obj/machinery/door/poddoor{dir = 8; id = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/supply)
"l" = (/turf/closed/wall/mineral/titanium/interior,/area/shuttle/supply) "l" = (/turf/closed/wall/mineral/titanium/interior,/area/shuttle/supply)
"q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/supply) "q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/effect/turf_decal/stripes/line,/turf/open/floor/plating/airless,/area/shuttle/supply)
"s" = (/turf/template_noop,/area/template_noop) "s" = (/turf/template_noop,/area/template_noop)
"t" = (/obj/structure/shuttle/engine/propulsion/burst/left,/turf/open/floor/plating/airless,/area/shuttle/supply) "t" = (/obj/structure/shuttle/engine/propulsion/burst/left,/obj/effect/turf_decal/stripes/line,/turf/open/floor/plating/airless,/area/shuttle/supply)
"u" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/supply) "u" = (/obj/structure/shuttle/engine/propulsion,/obj/effect/turf_decal/stripes/line,/turf/open/floor/plating/airless,/area/shuttle/supply)
"v" = (/obj/structure/shuttle/engine/propulsion/burst/right,/turf/open/floor/plating/airless,/area/shuttle/supply) "v" = (/obj/structure/shuttle/engine/propulsion/burst/right,/obj/effect/turf_decal/stripes/line,/turf/open/floor/plating/airless,/area/shuttle/supply)
"w" = (/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/blue,/area/shuttle/supply) "w" = (/obj/effect/turf_decal/stripes/line{dir = 1},/obj/machinery/light{dir = 1},/turf/open/floor/plasteel,/area/shuttle/supply)
"x" = (/obj/machinery/light{dir = 8},/turf/open/floor/mineral/titanium/blue,/area/shuttle/supply) "x" = (/obj/machinery/light{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel,/area/shuttle/supply)
"y" = (/obj/effect/turf_decal/stripes/line{dir = 10},/turf/open/floor/plasteel,/area/shuttle/supply)
"A" = (/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/supply)
"C" = (/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/supply)
"D" = (/obj/effect/turf_decal/stripes/line{dir = 4},/turf/open/floor/plasteel,/area/shuttle/supply)
"F" = (/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/shuttle/supply)
"K" = (/obj/effect/turf_decal/stripes/line{dir = 6},/turf/open/floor/plasteel,/area/shuttle/supply)
"M" = (/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plasteel,/area/shuttle/supply)
"S" = (/obj/effect/turf_decal/stripes/line{dir = 5},/turf/open/floor/plasteel,/area/shuttle/supply)
"X" = (/obj/effect/turf_decal/stripes/line,/turf/open/floor/plasteel,/area/shuttle/supply)
(1,1,1) = {" (1,1,1) = {"
bbbbbbb bbbbbbb
beeweeb beAwASb
beeeeeb bMFFFDb
beeeeef bMFFFDa
beeeeea bMFFFDf
bxeeehb bxFFFhb
beeeeec bMFFFDc
beeeeej bMFFFDi
beeeeeb byXXXKb
bleeelb blCCClb
bbqqqbb bbqqqbb
stuuuvs stuuuvs
"} "}
+5
View File
@@ -294,6 +294,7 @@
#define SPEECH_LANGUAGE 5 #define SPEECH_LANGUAGE 5
#define SPEECH_IGNORE_SPAM 6 #define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */ #define SPEECH_FORCED 7 */
#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum)
///from base of /mob/Login(): () ///from base of /mob/Login(): ()
#define COMSIG_MOB_LOGIN "mob_login" #define COMSIG_MOB_LOGIN "mob_login"
@@ -378,6 +379,7 @@
///from base of mob/living/carbon/soundbang_act(): (list(intensity)) ///from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
#define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE)
///from /item/organ/proc/Insert() (/obj/item/organ/) ///from /item/organ/proc/Insert() (/obj/item/organ/)
#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" #define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
///from /item/organ/proc/Remove() (/obj/item/organ/) ///from /item/organ/proc/Remove() (/obj/item/organ/)
@@ -566,6 +568,9 @@
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) ///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" #define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
#define COMSIG_HUMAN_PREFS_COPIED_TO "human_prefs_copied_to" //from datum/preferences/copy_to(): (datum/preferences, icon_updates, roundstart_checks)
#define COMSIG_HUMAN_HARDSET_DNA "human_hardset_dna" //from mob/living/carbon/human/hardset_dna(): (ui, se, newreal_name, newblood_type, datum/species, newfeatures)
#define COMSIG_HUMAN_ON_RANDOMIZE "humman_on_randomize" //from base of proc/randomize_human()
///Whenever EquipRanked is called, called after job is set ///Whenever EquipRanked is called, called after job is set
#define COMSIG_JOB_RECEIVED "job_received" #define COMSIG_JOB_RECEIVED "job_received"
+7
View File
@@ -187,6 +187,13 @@
#define TRAIT_NEVER_CLONE "donotclone" #define TRAIT_NEVER_CLONE "donotclone"
#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp. #define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp.
#define TRAIT_FLIMSY "flimsy" //you have 20% less maxhealth #define TRAIT_FLIMSY "flimsy" //you have 20% less maxhealth
//Hyper
#define TRAIT_VIRILE "virile" //you have 20% more chance of impreg
#define TRAIT_MACROPHILE "macrophile" //likes the big
#define TRAIT_MICROPHILE "microphile" //likes the small
#define TRAIT_TOUGH "tough" //you have 10% more maxhealth #define TRAIT_TOUGH "tough" //you have 10% more maxhealth
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
-11
View File
@@ -104,17 +104,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if(!src.holder) return if(!src.holder) return
message_admins("[key_name_admin(usr)] manually reloaded mentors") message_admins("[key_name_admin(usr)] manually reloaded mentors")
//Flavor Text
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavor Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
var/new_flavor = input(src, "Enter your new flavor text:", "Flavor text", null) as message|null
if(!isnull(new_flavor))
flavor_text = sanitize(new_flavor)
to_chat(src, "Your flavor text has been updated.")
//LOOC toggles //LOOC toggles
/client/verb/listen_looc() /client/verb/listen_looc()
set name = "Show/Hide LOOC" set name = "Show/Hide LOOC"
+1
View File
@@ -231,6 +231,7 @@
"ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
"ipc_antenna" = "None", "ipc_antenna" = "None",
"flavor_text" = "", "flavor_text" = "",
"silicon_flavor_text" = "",
"ooc_text" = "")) "ooc_text" = ""))
/proc/random_hair_style(gender) /proc/random_hair_style(gender)
+16 -5
View File
@@ -163,6 +163,7 @@
set waitfor = FALSE set waitfor = FALSE
to_chat(world, "<BR><BR><BR><span class='big bold'>The round has ended.</span>") to_chat(world, "<BR><BR><BR><span class='big bold'>The round has ended.</span>")
var/botmsg = "**The Round has ended!**```Round ID: [GLOB.round_id]\nRound Time: [DisplayTimeText(world.time - SSticker.round_start_time)]\nTotal Population: [GLOB.joined_player_list.len]```"
if(LAZYLEN(GLOB.round_end_notifiees)) if(LAZYLEN(GLOB.round_end_notifiees))
send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.")
@@ -179,6 +180,20 @@
var/popcount = gather_roundend_feedback() var/popcount = gather_roundend_feedback()
display_report(popcount) display_report(popcount)
CHECK_TICK
//Hyper bot list players
botmsg += "\n**The Crew!** ```"
for(var/p in GLOB.player_list)
var/mob/living/P = p //the living crew members
if(P)
botmsg += "[P.real_name]"
if(P.job)
botmsg += " ([P.job])"
botmsg += "\n"
botmsg += "```"
CHECK_TICK CHECK_TICK
// Add AntagHUD to everyone, see who was really evil the whole time! // Add AntagHUD to everyone, see who was really evil the whole time!
@@ -208,10 +223,6 @@
if(length(CONFIG_GET(keyed_list/cross_server))) if(length(CONFIG_GET(keyed_list/cross_server)))
send_news_report() send_news_report()
//tell the nice people on discord what went on before the salt cannon happens.
world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Kinaris News Network's report!", FALSE)
world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
CHECK_TICK CHECK_TICK
//These need update to actually reflect the real antagonists //These need update to actually reflect the real antagonists
@@ -226,7 +237,6 @@
total_antagonists[A.name] += "[key_name(A.owner)]" total_antagonists[A.name] += "[key_name(A.owner)]"
CHECK_TICK CHECK_TICK
//Now print them all into the log! //Now print them all into the log!
log_game("Antagonists at round end were...") log_game("Antagonists at round end were...")
for(var/antag_name in total_antagonists) for(var/antag_name in total_antagonists)
@@ -243,6 +253,7 @@
SSblackbox.Seal() SSblackbox.Seal()
sleep(50) sleep(50)
world.hypermessage(botmsg)
ready_for_reboot = TRUE ready_for_reboot = TRUE
standard_reboot() standard_reboot()
+52 -5
View File
@@ -25,6 +25,12 @@
if(SSparallax.random_layer) if(SSparallax.random_layer)
C.parallax_layers_cached += new SSparallax.random_layer C.parallax_layers_cached += new SSparallax.random_layer
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view)
if(SSmapping.config?.map_name == "Layenia Station")
C.parallax_layers_cached += new /obj/screen/parallax_layer/layenia/horizon(null, C.view)
C.parallax_layers_cached += new /obj/screen/parallax_layer/layenia/clouds1(null, C.view)
C.parallax_layers_cached += new /obj/screen/parallax_layer/layenia/clouds2(null, C.view)
C.parallax_layers_cached += new /obj/screen/parallax_layer/layenia/clouds3(null, C.view)
C.parallax_layers = C.parallax_layers_cached.Copy() C.parallax_layers = C.parallax_layers_cached.Copy()
@@ -66,24 +72,24 @@
switch(C.prefs.parallax) switch(C.prefs.parallax)
if (PARALLAX_INSANE) if (PARALLAX_INSANE)
C.parallax_throttle = FALSE C.parallax_throttle = FALSE
C.parallax_layers_max = 5 C.parallax_layers_max = 10
return TRUE return TRUE
if (PARALLAX_MED) if (PARALLAX_MED)
C.parallax_throttle = PARALLAX_DELAY_MED C.parallax_throttle = PARALLAX_DELAY_MED
C.parallax_layers_max = 3 C.parallax_layers_max = 8
return TRUE return TRUE
if (PARALLAX_LOW) if (PARALLAX_LOW)
C.parallax_throttle = PARALLAX_DELAY_LOW C.parallax_throttle = PARALLAX_DELAY_LOW
C.parallax_layers_max = 1 C.parallax_layers_max = 7
return TRUE return TRUE
if (PARALLAX_DISABLE) if (PARALLAX_DISABLE)
return FALSE return FALSE
C.parallax_throttle = PARALLAX_DELAY_DEFAULT C.parallax_throttle = PARALLAX_DELAY_DEFAULT
C.parallax_layers_max = 4 C.parallax_layers_max = 10
return TRUE return TRUE
/datum/hud/proc/update_parallax_pref(mob/viewmob) /datum/hud/proc/update_parallax_pref(mob/viewmob)
@@ -320,7 +326,7 @@
blend_mode = BLEND_OVERLAY blend_mode = BLEND_OVERLAY
absolute = TRUE //Status of seperation absolute = TRUE //Status of seperation
speed = 3 speed = 3
layer = 30 layer = 4
/obj/screen/parallax_layer/planet/update_status(mob/M) /obj/screen/parallax_layer/planet/update_status(mob/M)
var/client/C = M.client var/client/C = M.client
@@ -331,3 +337,44 @@
/obj/screen/parallax_layer/planet/update_o() /obj/screen/parallax_layer/planet/update_o()
return //Shit wont move return //Shit wont move
//Layenia parallaxes
/obj/screen/parallax_layer/layenia
icon_state = null
blend_mode = BLEND_OVERLAY
absolute = TRUE
speed = 0.6
layer = 5
/obj/screen/parallax_layer/layenia/horizon
icon_state = "layeniahorizon"
speed = 0.3
absolute = FALSE
/obj/screen/parallax_layer/layenia/clouds1
icon_state = "layenia1"
speed = 0.6
layer = 6
/obj/screen/parallax_layer/layenia/clouds2
icon_state = "layenia2"
speed = 1
layer = 7
/obj/screen/parallax_layer/layenia/clouds3
icon_state = "layenia3"
speed = 1.4
layer = 8
/obj/screen/parallax_layer/layenia/update_status(mob/M)
var/client/C = M.client
var/turf/posobj = get_turf(C.eye)
if(!posobj)
return
invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT
/*
/obj/screen/parallax_layer/tparallax1/update_status(mob/M)
if(SSmapping.config?.map_name != "Layenia Station")
*/
+31 -17
View File
@@ -14,6 +14,7 @@ SUBSYSTEM_DEF(job)
var/overflow_role = "Assistant" var/overflow_role = "Assistant"
/datum/controller/subsystem/job/Initialize(timeofday) /datum/controller/subsystem/job/Initialize(timeofday)
SSmapping.HACK_LoadMapConfig() SSmapping.HACK_LoadMapConfig()
if(!occupations.len) if(!occupations.len)
@@ -390,7 +391,6 @@ SUBSYSTEM_DEF(job)
var/datum/job/job = GetJob(rank) var/datum/job/job = GetJob(rank)
H.job = rank H.job = rank
equip_loadout(N, H)
//If we joined at roundstart we should be positioned at our workstation //If we joined at roundstart we should be positioned at our workstation
if(!joined_late) if(!joined_late)
@@ -416,22 +416,36 @@ SUBSYSTEM_DEF(job)
if(H.mind) if(H.mind)
H.mind.assigned_role = rank H.mind.assigned_role = rank
//Job loadout, equipping, and flavortext when spawning
if(job) if(job)
var/new_mob = job.equip(H, null, null, joined_late) var/list/handle_storage = equip_loadout(N, H) //Loadout gear
if(ismob(new_mob)) var/new_mob = job.equip(H, null, null, joined_late) //Job gear
if(ismob(new_mob)) //The above doesnt return a value, but we check this anyways or else everything breaks!
H = new_mob H = new_mob
if(!joined_late) if(!joined_late)
N.new_character = H N.new_character = H
else else
M = H M = H
SSpersistence.antag_rep_change[M.client.ckey] += job.GetAntagRep() if(LAZYLEN(handle_storage)) //equip_loadout returned a list. This list is backpack contents we should store, as by now we should have a backpack and a single reference mob
if(ishuman(H))
var/mob/living/carbon/human/_H = H
if(_H.back)
for(var/atom/movable/A in handle_storage)
if(!SEND_SIGNAL(_H.back, COMSIG_TRY_STORAGE_INSERT, A, null, TRUE, TRUE))
A.forceMove(get_turf(H)) //Try and store into the backpack. If the backpack is full, drop it to the ground
else //No backpack
for(var/atom/movable/A in handle_storage)
A.forceMove(get_turf(H))
//Flavortext
var/display_rank = rank
if(M.client && M.client.prefs && M.client.prefs.alt_titles_preferences[rank])
display_rank = M.client.prefs.alt_titles_preferences[rank]
to_chat(M, "<b>You are the [display_rank].</b>")
var/display_rank = rank
if(M.client && M.client.prefs && M.client.prefs.alt_titles_preferences[rank])
display_rank = M.client.prefs.alt_titles_preferences[rank]
to_chat(M, "<b>You are the [display_rank].</b>")
if(job)
to_chat(M, "<b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>") to_chat(M, "<b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>")
to_chat(M, "<b>To speak on your departments radio, use the :h button. To see others, look closely at your headset.</b>") to_chat(M, "<b>To speak on your departments radio, use the :h button. To see others, look closely at your headset.</b>")
if(job.req_admin_notify) if(job.req_admin_notify)
@@ -441,15 +455,15 @@ SUBSYSTEM_DEF(job)
if(CONFIG_GET(number/minimal_access_threshold)) if(CONFIG_GET(number/minimal_access_threshold))
to_chat(M, "<span class='notice'><B>As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.</B></span>") to_chat(M, "<span class='notice'><B>As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.</B></span>")
job.after_spawn(H, M, joined_late)
//Account ID. ID is handled by human initialization
if(ishuman(H)) if(ishuman(H))
var/mob/living/carbon/human/wageslave = H var/mob/living/carbon/human/wageslave = H
to_chat(M, "<b><span class = 'big'>Your account ID is [wageslave.account_id]</span></b>") to_chat(M, "<b><span class='big'>Your account ID is [wageslave.account_id]</span></b>")
to_chat(M, "<b><span class = 'notice'>You do not have a pin, can set your pin at a ATM.</b>") to_chat(M, "<b><span class='notice'>You do not have a pin, can set your pin at an ATM.</b>")
H.add_memory("Your account ID is [wageslave.account_id].") if(H.mind)
H.mind.memory += "Your account ID is [wageslave.account_id].<BR>"
if(job && H)
job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
return H return H
@@ -643,4 +657,4 @@ SUBSYSTEM_DEF(job)
. |= player.mind . |= player.mind
/datum/controller/subsystem/job/proc/JobDebug(message) /datum/controller/subsystem/job/proc/JobDebug(message)
log_job_debug(message) log_job_debug(message)
+1 -1
View File
@@ -38,7 +38,7 @@
/datum/component/chasm/proc/is_safe() /datum/component/chasm/proc/is_safe()
//if anything matching this typecache is found in the chasm, we don't drop things //if anything matching this typecache is found in the chasm, we don't drop things
var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/lattice, /obj/structure/stone_tile))
var/atom/parent = src.parent var/atom/parent = src.parent
var/list/found_safeties = typecache_filter_list(parent.contents, chasm_safeties_typecache) var/list/found_safeties = typecache_filter_list(parent.contents, chasm_safeties_typecache)
+6
View File
@@ -46,6 +46,12 @@
//begin playsound shenanigans// //begin playsound shenanigans//
//for big characters, add alittle boom
if(LM.size_multiplier > 1.5)
var/stompsound = pick( 'sound/effects/footstep/giant1.ogg','sound/effects/footstep/giant2.ogg')
var/giantvolume = LM.size_multiplier * 9
playsound(T, stompsound, giantvolume)
//for barefooted non-clawed mobs like monkeys //for barefooted non-clawed mobs like monkeys
if(isbarefoot(LM)) if(isbarefoot(LM))
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
+2
View File
@@ -12,6 +12,7 @@
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look
var/obj/screen/mood/screen_obj var/obj/screen/mood/screen_obj
var/lastupdate = 0
/datum/component/mood/Initialize() /datum/component/mood/Initialize()
if(!isliving(parent)) if(!isliving(parent))
@@ -91,6 +92,7 @@
mood += event.mood_change mood += event.mood_change
if(!event.hidden) if(!event.hidden)
shown_mood += event.mood_change shown_mood += event.mood_change
mood *= mood_modifier mood *= mood_modifier
shown_mood *= mood_modifier shown_mood *= mood_modifier
+5 -2
View File
@@ -54,11 +54,12 @@
if(ishuman(destination)) if(ishuman(destination))
var/mob/living/carbon/human/H = destination var/mob/living/carbon/human/H = destination
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
destination.ooc_text = destination.dna.features["ooc_text"] //Update the flavor_text to use new dna text destination.ooc_text = destination.dna.features["ooc_text"] //Update the flavor_text to use new dna text
if(transfer_SE) if(transfer_SE)
destination.dna.mutation_index = mutation_index destination.dna.mutation_index = mutation_index
SEND_SIGNAL(destination, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, src, transfer_SE)
/datum/dna/proc/copy_dna(datum/dna/new_dna) /datum/dna/proc/copy_dna(datum/dna/new_dna)
new_dna.unique_enzymes = unique_enzymes new_dna.unique_enzymes = unique_enzymes
new_dna.mutation_index = mutation_index new_dna.mutation_index = mutation_index
@@ -356,7 +357,6 @@
if(newfeatures) if(newfeatures)
dna.features = newfeatures dna.features = newfeatures
flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text
ooc_text = dna.features["ooc_text"] //Update the flavor_text to use new dna text ooc_text = dna.features["ooc_text"] //Update the flavor_text to use new dna text
if(mrace) if(mrace)
@@ -379,6 +379,9 @@
dna.mutation_index = mutation_index dna.mutation_index = mutation_index
domutcheck() domutcheck()
SEND_SIGNAL(src, COMSIG_HUMAN_HARDSET_DNA, ui, newreal_name, newblood_type, mrace, newfeatures)
// change to SEND_SIGNAL(src, COMSIG_HUMAN_HARDSET_DNA, ui, se, newreal_name, newblood_type, mrace, newfeatures) if we add structural enzymes.
if(mrace || newfeatures || ui) if(mrace || newfeatures || ui)
update_body() update_body()
update_hair() update_hair()
+188
View File
@@ -0,0 +1,188 @@
GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
/datum/element/flavor_text
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
id_arg_index = 3
var/flavor_name = "Flavor Text"
var/list/texts_by_atom = list()
var/addendum = ""
var/always_show = FALSE
var/max_len = MAX_FLAVOR_LEN
var/can_edit = TRUE
/// For preference/DNA saving/loading. Null to prevent. Prefs are only loaded from obviously if it exists in preferences.features.
var/save_key
/// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\]
var/examine_no_preview = FALSE
var/examineTabOutput = ""
/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE)
. = ..()
if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too.
return ELEMENT_INCOMPATIBLE
if(_max_len)
max_len = _max_len
texts_by_atom[target] = copytext(text, 1, max_len)
if(_name)
flavor_name = _name
if(!isnull(addendum))
addendum = _addendum
always_show = _always_show
can_edit = _edit
save_key = _save_key
examine_no_preview = _examine_no_preview
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/show_flavor)
if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being
var/mob/M = target
LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src)
M.verbs |= /mob/proc/manage_flavor_tests
if(save_key && ishuman(target))
RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
/datum/element/flavor_text/Detach(atom/A)
. = ..()
UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_HUMAN_PREFS_COPIED_TO))
texts_by_atom -= A
if(can_edit && ismob(A))
var/mob/M = A
LAZYREMOVE(GLOB.mobs_with_editable_flavor_text[M], src)
if(!GLOB.mobs_with_editable_flavor_text[M])
GLOB.mobs_with_editable_flavor_text -= M
M.verbs -= /mob/proc/manage_flavor_tests
/datum/element/flavor_text/proc/show_flavor(atom/target, mob/user, list/examine_list)
if(!always_show && isliving(target))
var/mob/living/L = target
var/unknown = L.get_visible_name() == "Unknown"
if(!unknown && iscarbon(target))
var/mob/living/carbon/C = L
unknown = (C.wear_mask && (C.wear_mask.flags_inv & HIDEFACE)) || (C.head && (C.head.flags_inv & HIDEFACE))
if(unknown)
if(!("...?" in examine_list)) //can't think of anything better in case of multiple flavor texts.
examine_list += "...?"
return
var/text = texts_by_atom[target]
if(!text)
return
if(examine_no_preview)
examine_list += "<span class='notice'><a href='?src=[REF(src)];show_flavor=[REF(target)]'>\[[flavor_name]\]</a></span>"
return
var/msg = replacetext(text, "\n", " ")
if(length_char(msg) <= 40)
examine_list += "<span class='notice'>[msg]</span>"
else
examine_list += "<span class='notice'>[copytext_char(msg, 1, 37)]... <a href='?src=[REF(src)];show_flavor=[REF(target)]'>More...</span></a>"
//Examine Tab stuff - Hyperstation
examineTabOutput = "<center>"
if(ishuman(target)) //user just returned, y'know, the user's own species. dumb.
var/mob/living/carbon/human/L = target
if(L.gender)
examineTabOutput += "[icon2html('hyperstation/icons/chat/gender.dmi', world, L.gender)]"
examineTabOutput += "[L.name] "
examineTabOutput += "([L.dna.custom_species ? L.dna.custom_species : L.dna.species.name])"
examineTabOutput += "</center>"
examineTabOutput += "<br>[url_encode(msg)]"
if(ismob(target))
var/mob/M = target
if(M.ooc_text)
examineTabOutput += "<br><br><i><b>OOC</b>"
examineTabOutput += "<br>[url_encode(M.ooc_text)]"
user.client << output(examineTabOutput, "statbrowser:update_examine") //open the examine window
user.client << output(null, "statbrowser:create_mobexamine") //open the examine window
/datum/element/flavor_text/Topic(href, href_list)
. = ..()
if(.)
return
if(href_list["show_flavor"])
var/atom/target = locate(href_list["show_flavor"])
var/text = texts_by_atom[target]
if(text)
usr << browse("<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[target.name]</TITLE></HEAD><BODY><TT>[replacetext(texts_by_atom[target], "\n", "<BR>")]</TT></BODY></HTML>", "window=[target.name];size=500x200")
onclose(usr, "[target.name]")
return TRUE
/mob/proc/manage_flavor_tests()
set name = "Manage Flavor Texts"
set desc = "Used to manage your various flavor texts."
set category = "IC"
var/list/L = GLOB.mobs_with_editable_flavor_text[src]
if(length(L) == 1)
var/datum/element/flavor_text/F = L[1]
F.set_flavor(src)
return
var/list/choices = list()
for(var/i in L)
var/datum/element/flavor_text/F = i
choices[F.flavor_name] = F
var/chosen = input(src, "Which flavor text would you like to modify?") as null|anything in choices
if(!chosen)
return
var/datum/element/flavor_text/F = choices[chosen]
F.set_flavor(src)
/datum/element/flavor_text/proc/set_flavor(mob/user)
if(!(user in texts_by_atom))
return FALSE
var/lower_name = lowertext(flavor_name)
var/new_text = stripped_multiline_input(user, "Set the [lower_name] displayed on 'examine'. [addendum]", flavor_name, html_decode(texts_by_atom[usr]), max_len, TRUE)
if(!isnull(new_text) && (user in texts_by_atom))
texts_by_atom[user] = new_text
to_chat(src, "Your [lower_name] has been updated.")
return TRUE
return FALSE
/datum/element/flavor_text/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE)
if(P.features.Find(save_key))
texts_by_atom[H] = P.features[save_key]
//subtypes with additional hooks for DNA and preferences.
/datum/element/flavor_text/carbon
//list of antagonists etcetera that should have nothing to do with people's snowflakes.
var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert,
/datum/antagonist/nukeop, /datum/antagonist/wizard))
/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE)
if(!iscarbon(target))
return ELEMENT_INCOMPATIBLE
. = ..()
if(. == ELEMENT_INCOMPATIBLE)
return
RegisterSignal(target, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, .proc/update_dna_flavor_text)
RegisterSignal(target, COMSIG_MOB_ANTAG_ON_GAIN, .proc/on_antag_gain)
if(ishuman(target))
RegisterSignal(target, COMSIG_HUMAN_HARDSET_DNA, .proc/update_dna_flavor_text)
RegisterSignal(target, COMSIG_HUMAN_ON_RANDOMIZE, .proc/unset_flavor)
/datum/element/flavor_text/carbon/Detach(mob/living/carbon/C)
. = ..()
UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_MOB_ANTAG_ON_GAIN, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE))
/datum/element/flavor_text/carbon/proc/update_dna_flavor_text(mob/living/carbon/C)
texts_by_atom[C] = C.dna.features[save_key]
/datum/element/flavor_text/carbon/set_flavor(mob/living/carbon/user)
. = ..()
if(. && user.dna)
user.dna.features[save_key] = texts_by_atom[user]
/datum/element/flavor_text/carbon/proc/unset_flavor(mob/living/carbon/user)
texts_by_atom[user] = ""
/datum/element/flavor_text/carbon/proc/on_antag_gain(mob/living/carbon/user, datum/antagonist/antag)
if(is_type_in_typecache(antag, i_dont_even_know_who_you_are))
texts_by_atom[user] = ""
if(user.dna)
user.dna.features[save_key] = ""
+34 -37
View File
@@ -39,52 +39,49 @@
pre_equip(H, visualsOnly) pre_equip(H, visualsOnly)
//Start with uniform,suit,backpack for additional slots //Start with uniform,suit,backpack for additional slots
if(uniform)
H.equip_to_slot_or_store_and_del(new uniform(H),SLOT_W_UNIFORM)
if(suit)
H.equip_to_slot_or_store_and_del(new suit(H),SLOT_WEAR_SUIT)
if(back) if(back)
H.equip_to_slot_or_del(new back(H),SLOT_BACK) H.equip_to_slot_or_del(new back(H),SLOT_BACK)
if(!visualsOnly && backpack_contents) //Keep things organized when we can't equip other stuff by having this first
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
H.equip_to_slot_or_store_and_del(new l_pocket(H),SLOT_L_STORE)
if(r_pocket)
H.equip_to_slot_or_store_and_del(new r_pocket(H),SLOT_R_STORE)
if(backpack_contents)
for(var/path in backpack_contents) for(var/path in backpack_contents)
var/number = backpack_contents[path] var/number = backpack_contents[path]
if(!isnum(number))//Default to 1 if(!isnum(number))//Default to 1
number = 1 number = 1
for(var/i in 1 to number) for(var/i in 1 to number)
H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK)
if(belt)
H.equip_to_slot_or_store_and_del(new belt(H),SLOT_BELT) if(uniform)
if(gloves) var/obj/item/clothing/under/U = new uniform(H)
H.equip_to_slot_or_store_and_del(new gloves(H),SLOT_GLOVES) H.equip_to_slot_or_store(U,SLOT_W_UNIFORM)
if(shoes) if(accessory)
H.equip_to_slot_or_store_and_del(new shoes(H),SLOT_SHOES)
if(head)
H.equip_to_slot_or_store_and_del(new head(H),SLOT_HEAD)
if(mask)
H.equip_to_slot_or_store_and_del(new mask(H),SLOT_WEAR_MASK)
if(neck)
H.equip_to_slot_or_store_and_del(new neck(H),SLOT_NECK)
if(ears)
H.equip_to_slot_or_store_and_del(new ears(H),SLOT_EARS)
if(glasses)
H.equip_to_slot_or_store_and_del(new glasses(H),SLOT_GLASSES)
if(id)
H.equip_to_slot_or_store_and_del(new id(H),SLOT_WEAR_ID)
if(suit_store)
H.equip_to_slot_or_store_and_del(new suit_store(H),SLOT_S_STORE)
if(accessory)
var/obj/item/clothing/under/U = H.w_uniform
if(U)
U.attach_accessory(new accessory(H)) U.attach_accessory(new accessory(H))
else if(suit)
WARNING("Unable to equip accessory [accessory] in outfit [name]. No uniform present!") H.equip_to_slot_or_store(new suit(H),SLOT_WEAR_SUIT)
if(!visualsOnly)
if(l_pocket)
H.equip_to_slot_or_store(new l_pocket(H),SLOT_L_STORE)
if(r_pocket)
H.equip_to_slot_or_store(new r_pocket(H),SLOT_R_STORE)
if(belt)
H.equip_to_slot_or_store(new belt(H),SLOT_BELT)
if(gloves)
H.equip_to_slot_or_store(new gloves(H),SLOT_GLOVES)
if(shoes)
H.equip_to_slot_or_store(new shoes(H),SLOT_SHOES)
if(head)
H.equip_to_slot_or_store(new head(H),SLOT_HEAD)
if(mask)
H.equip_to_slot_or_store(new mask(H),SLOT_WEAR_MASK)
if(neck)
H.equip_to_slot_or_store(new neck(H),SLOT_NECK)
if(ears)
H.equip_to_slot_or_store(new ears(H),SLOT_EARS)
if(glasses)
H.equip_to_slot_or_store(new glasses(H),SLOT_GLASSES)
if(id)
H.equip_to_slot_or_store(new id(H),SLOT_WEAR_ID)
if(suit_store)
H.equip_to_slot_or_store(new suit_store(H),SLOT_S_STORE)
if(l_hand) if(l_hand)
H.put_in_l_hand(new l_hand(H)) H.put_in_l_hand(new l_hand(H))
@@ -0,0 +1,36 @@
/datum/weather/ash_storm/layenia //because fuck writing my own code
name = "Layenia Weather"
desc = "A subset of weather affecting Layenia"
weather_color = "white"
telegraph_message = "<span class='warning'>Thundering clouds pass overhead, swept up by a steady wind.</span>"
telegraph_duration = 300
telegraph_overlay = "light_snow"
weather_message = "<span class='boldwarning'><i>Clouds storm over the station slowly...</i></span>"
weather_duration_lower = 600
weather_duration_upper = 8200
weather_overlay = "snow_storm"
end_message = "<span class='boldannounce'>Sunlight arches over the station once more; the storm has passed.</span>"
end_duration = 300
end_overlay = "light_snow"
area_type = /area/layenia
target_trait = ZTRAIT_STATION
probability = 100
barometer_predictable = TRUE
aesthetic = TRUE
//datum/weather/layenia/telegraph()
//datum/weather/layenia/start()
//datum/weather/layenia/wind_down()
//datum/weather/layenia/end()
//datum/weather/ash_storm/layenia/weather_act
+4
View File
@@ -1380,3 +1380,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Nothing Here" name = "Nothing Here"
icon_state = "yellow" icon_state = "yellow"
ambientsounds = SPOOKY ambientsounds = SPOOKY
/area/arcade
name = "Arcade"
icon_state = "yellow"
+1
View File
@@ -53,6 +53,7 @@
*/ */
/area/holodeck/rec_center /area/holodeck/rec_center
name = "\improper Recreational Holodeck" name = "\improper Recreational Holodeck"
has_gravity = STANDARD_GRAVITY
/area/holodeck/rec_center/offline /area/holodeck/rec_center/offline
name = "Holodeck - Offline" name = "Holodeck - Offline"
+29
View File
@@ -0,0 +1,29 @@
area/layenia
name = "Layenia"
icon_state = "mining"
has_gravity = STANDARD_GRAVITY
blob_allowed = FALSE
requires_power = TRUE
outdoors = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
ambientsounds = MINING
atmos = FALSE
flags_1 = NONE
area/layenia/cloudlayer
name = "Laneya clouds"
icon_state = "space"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
atmos = FALSE
area/layenia/powered
name = "Layenia Powered"
icon_state = "centcom"
requires_power = FALSE
has_gravity = STANDARD_GRAVITY
noteleport = FALSE
blob_allowed = TRUE
flags_1 = NONE
outdoors = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
atmos = FALSE
+8 -6
View File
@@ -864,14 +864,16 @@ Proc for attack log creation, because really why not
filters += filter(arglist(arguments)) filters += filter(arglist(arguments))
/atom/movable/proc/get_filter(name) /atom/movable/proc/get_filter(name)
if(filter_data && filter_data[name]) if(filter_data)
return filters[filter_data.Find(name)] if(filter_data[name])
return filters[filter_data.Find(name)]
/atom/movable/proc/remove_filter(name) /atom/movable/proc/remove_filter(name)
if(filter_data[name]) if(filter_data)
filter_data -= name if(filter_data[name])
update_filters() filter_data -= name
return TRUE update_filters()
return TRUE
/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) /atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
@@ -15,6 +15,12 @@
var/list/list_observers = list() var/list/list_observers = list()
/datum/dynamic_ruleset/event/acceptable(population=0, threat=0) /datum/dynamic_ruleset/event/acceptable(population=0, threat=0)
if(istype(controller, /datum/round_event_control))
var/datum/round_event_control/R = controller
if(R.map_blacklist.len && (SSmapping.config.map_file in R.map_blacklist)) //Apparently dynamic doesn't call a controller's canSpawnEvent :>
return FALSE
if(R.map_whitelist.len && !(SSmapping.config.map_file in R.map_whitelist))
return FALSE
return ..() return ..()
/datum/dynamic_ruleset/event/ready(forced = 0) /datum/dynamic_ruleset/event/ready(forced = 0)
+15 -5
View File
@@ -133,6 +133,7 @@
/obj/machinery/door/airlock/LateInitialize() /obj/machinery/door/airlock/LateInitialize()
. = ..() . = ..()
autorotation() //auto rotate door
if (cyclelinkeddir) if (cyclelinkeddir)
cyclelinkairlock() cyclelinkairlock()
if(abandoned) if(abandoned)
@@ -159,11 +160,20 @@
update_icon() update_icon()
/obj/machinery/door/airlock/proc/getrotation() //for auto rotating doors, because im sick of doing it /obj/machinery/door/airlock/proc/autorotation() //for auto rotating doors, because im sick of doing it
for(var/turf/O in get_step(src,SOUTH)) var/turf/N = get_step(src, NORTH)
log_mapping("[src]: [O]") var/turf/S = get_step(src, SOUTH)
if(O.density)
log_mapping("[src]: [O] is dense") if(istype(N, /turf/closed)) //Wall
dir = 4
if(istype(S, /turf/closed))
dir = 4
var/obj/structure/window/W = locate(/obj/structure/window, N) //Window
if(W)
dir = 4
var/obj/structure/window/R = locate(/obj/structure/window, S)
if(R)
dir = 4
/obj/machinery/door/airlock/ComponentInitialize() /obj/machinery/door/airlock/ComponentInitialize()
. = ..() . = ..()
@@ -350,7 +350,10 @@
icon = 'icons/obj/doors/airlocks/external/external.dmi' icon = 'icons/obj/doors/airlocks/external/external.dmi'
overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
color_overlay_file = 'icons/obj/doors/airlocks/external/color.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_ext assemblytype = /obj/structure/door_assembly/door_assembly_ext
basecolor = "#ff0000" //red
/obj/machinery/door/airlock/external/glass /obj/machinery/door/airlock/external/glass
opacity = 0 opacity = 0
+57
View File
@@ -656,3 +656,60 @@
if(islist(icon_states && icon_states.len)) if(islist(icon_states && icon_states.len))
icon_state = pick(icon_states) icon_state = pick(icon_states)
/obj/structure/flora/crystal
name = "crystal"
desc = "You shouldnt see this!"
gender = PLURAL //trans rights
max_integrity = 30
/obj/structure/flora/crystal/small
name = "small crystals"
icon = 'icons/obj/flora/layeniasmall.dmi'
light_range = 2
light_power = 0.25
light_color = LIGHT_COLOR_BLUE
//Small crystal clusters
/obj/structure/flora/crystal/small/pile
name = "small crystals"
desc = "A pile of small crystals"
icon_state = "crystals"
/obj/structure/flora/crystal/small/pile/Initialize()
if(icon_state == "crystals")
icon_state = "crystals[rand(1, 4)]"
. = ..()
//Small crystal growths
/obj/structure/flora/crystal/small/growth
name = "small crystals"
desc = "A growth of small crystals"
icon_state = "crystalgrowth"
/obj/structure/flora/crystal/small/growth/Initialize()
if(icon_state == "crystalgrowth")
icon_state = "crystalgrowth[rand(1, 4)]"
. = ..()
/obj/structure/flora/crystal/medium
name = "medium crystals"
icon = 'icons/obj/flora/layeniamedium.dmi'
pixel_x = -16
pixel_y = -3
layer = ABOVE_ALL_MOB_LAYER
light_range = 4
light_power = 0.75
light_color = LIGHT_COLOR_BLUE
//Medium crystal growths
/obj/structure/flora/crystal/medium/growth
name = "medium crystals"
desc = "A growth of medium crystals"
icon_state = "crystalgrowth"
/obj/structure/flora/crystal/medium/growth/Initialize()
if(icon_state == "crystalgrowth")
icon_state = "crystalgrowth[rand(1, 3)]"
. = ..()
+2
View File
@@ -15,7 +15,9 @@
/turf/closed/wall, /turf/closed/wall,
/obj/structure/falsewall) /obj/structure/falsewall)
smooth = SMOOTH_MORE smooth = SMOOTH_MORE
obj_flags = BLOCK_Z_FALL
// flags = CONDUCT_1 // flags = CONDUCT_1
//planetary_atmos = TRUE
/obj/structure/lattice/examine(mob/user) /obj/structure/lattice/examine(mob/user)
. = ..() . = ..()
+41
View File
@@ -74,6 +74,19 @@
if(istype(AM)) if(istype(AM))
playsound(src,sound,50,1) playsound(src,sound,50,1)
/turf/open/indestructible/concrete
name = "concrete"
icon = 'icons/turf/floors.dmi'
icon_state = "concrete"
baseturfs = /turf/open/floor/plating/asteroid/layenia
initial_gas_mix = FROZEN_ATMOS
planetary_atmos = TRUE
/turf/open/indestructible/concrete/smooth
icon_state = "concrete2"
initial_gas_mix = FROZEN_ATMOS
planetary_atmos = TRUE
/turf/open/indestructible/cobble/side /turf/open/indestructible/cobble/side
icon_state = "cobble_side" icon_state = "cobble_side"
@@ -92,6 +105,27 @@
heavyfootstep = FOOTSTEP_GENERIC_HEAVY heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE tiled_dirt = FALSE
/turf/open/indestructible/layenia/crystal
name = "Lattice Crystal"
desc = "A glowing azure crystal, with strange properties to make things float."
icon = 'icons/turf/floors/crystal_floor.dmi'
baseturfs = /turf/open/indestructible/layenia/crystal
slowdown = 1
light_range = 4
light_power = 0.5
barefootstep = FOOTSTEP_HARD_BAREFOOT
clawfootstep = FOOTSTEP_HARD_CLAW
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
light_color = LIGHT_COLOR_BLUE
initial_gas_mix = FROZEN_ATMOS
planetary_atmos = TRUE
smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE
canSmoothWith = list(/turf/open/indestructible/layenia/crystal)
/turf/open/indestructible/layenia/crystal/garden
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
planetary_atmos = TRUE
/turf/open/indestructible/necropolis /turf/open/indestructible/necropolis
name = "necropolis floor" name = "necropolis floor"
desc = "It's regarding you suspiciously." desc = "It's regarding you suspiciously."
@@ -208,6 +242,13 @@
//testing("Active turf found. Return value of compare(): [is_active]") //testing("Active turf found. Return value of compare(): [is_active]")
excited = TRUE excited = TRUE
SSair.active_turfs |= src SSair.active_turfs |= src
//Issues with air runtiming and you don't know where? Uncomment the following code.
/*
if(air == null)
log_game("Bad air from [src] at [src.loc]")
if(enemy_air == null)
log_game("Bad air from [enemy_tile] at [enemy_tile.loc]")
*/
/turf/open/proc/GetHeatCapacity() /turf/open/proc/GetHeatCapacity()
. = air.heat_capacity() . = air.heat_capacity()
+22
View File
@@ -115,3 +115,25 @@
var/turf/T = safepick(get_area_turfs(/area/fabric_of_reality)) var/turf/T = safepick(get_area_turfs(/area/fabric_of_reality))
if(T) if(T)
set_target(T) set_target(T)
/turf/open/chasm/cloud
name = "clouds"
gender = PLURAL
desc = "Clouds as far as the eye can see... Watch your step."
icon = 'icons/turf/space.dmi'
icon_state = "0"
plane = PLANE_SPACE
tiled_dirt = FALSE
baseturfs = /turf/open/chasm/cloud
smooth = SMOOTH_FALSE
initial_gas_mix = FROZEN_ATMOS
/turf/open/chasm/cloud/Initialize()
. = ..()
icon_state = SPACE_ICON_STATE
/turf/open/chasm/cloud/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
underlay_appearance.icon = 'icons/turf/space.dmi'
underlay_appearance.icon_state = SPACE_ICON_STATE
underlay_appearance.plane = PLANE_SPACE
return TRUE
@@ -19,13 +19,14 @@
attachment_holes = FALSE attachment_holes = FALSE
var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt
var/dug var/dug
var/quantity_of_available_tiles = 12 //How many sprites do you have in the DMI? Note, consider tile 0. 12 here means = 13 titles. 13 tiles is the golden standard.
/turf/open/floor/plating/asteroid/Initialize() /turf/open/floor/plating/asteroid/Initialize()
var/proper_name = name var/proper_name = name
. = ..() . = ..()
name = proper_name name = proper_name
if(prob(floor_variance)) if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]" icon_state = "[environment_type][rand(0,quantity_of_available_tiles)]"
/turf/open/floor/plating/asteroid/proc/getDug() /turf/open/floor/plating/asteroid/proc/getDug()
new digResult(src, 5) new digResult(src, 5)
@@ -363,3 +364,42 @@
/turf/open/floor/plating/asteroid/snow/atmosphere /turf/open/floor/plating/asteroid/snow/atmosphere
initial_gas_mix = FROZEN_ATMOS initial_gas_mix = FROZEN_ATMOS
planetary_atmos = FALSE planetary_atmos = FALSE
//Layenia stuff
/turf/open/floor/plating/asteroid/layenia
gender = PLURAL //trans rights
name = "crimson Rock"
desc = "A cold rock, rusted scarlet in color."
icon = 'icons/turf/floors.dmi'
baseturfs = /turf/open/floor/plating/asteroid/layenia
icon_state = "layenia"
icon_plating = "layenia"
initial_gas_mix = FROZEN_ATMOS
slowdown = 1
environment_type = "layenia"
flags_1 = NONE
planetary_atmos = TRUE
burnt_states = null
bullet_sizzle = TRUE
bullet_bounce_sound = null
digResult = /obj/item/stack/ore/glass/basalt
floor_variance = 50 //This means 50% chance of variating from the default tile.
quantity_of_available_tiles = 4
//light_range = 2
//light_power = 0.15
//light_color = LIGHT_COLOR_WHITE
/turf/open/floor/plating/asteroid/layenia/Initialize()
. = ..()
//We no longer randomize the icon state here. That is done by the supercall in our parent, asteroid.
set_layenia_light(src)
/turf/open/floor/plating/asteroid/layenia/garden
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
planetary_atmos = TRUE
/proc/set_layenia_light(turf/open/floor/B)
switch(B.icon_state)
if("layenia3", "layenia4")
B.set_light(2, 0.6, LIGHT_COLOR_BLUE) //more light
@@ -240,5 +240,3 @@
/turf/open/floor/plating/snowed/temperatre /turf/open/floor/plating/snowed/temperatre
temperature = 255.37 temperature = 255.37
+13 -1
View File
@@ -522,4 +522,16 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1 defer_change = 1
/turf/closed/mineral/layenia
name = "Crimson rock"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/layeniarocks.dmi'
icon_state = "layenia"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = null
baseturfs = /turf/open/floor/plating/asteroid/layenia
initial_gas_mix = FROZEN_ATMOS
environment_type = "layenia"
turf_type = /turf/open/floor/plating/asteroid/layenia
+1
View File
@@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/panicbunker, /client/proc/panicbunker,
/client/proc/addbunkerbypass, /client/proc/addbunkerbypass,
/client/proc/discordmessage,
/client/proc/revokebunkerbypass, /client/proc/revokebunkerbypass,
/client/proc/stop_sounds, /client/proc/stop_sounds,
/client/proc/debugstatpanel, /client/proc/debugstatpanel,
+4 -1
View File
@@ -37,7 +37,10 @@
H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list) H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
H.dna.features["moth_fluff"] = pick(GLOB.moth_fluffs_list) H.dna.features["moth_fluff"] = pick(GLOB.moth_fluffs_list)
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
H.dna.features["flavor_text"] = "" //Oh no.
SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE)
H.update_body() H.update_body()
H.update_hair() H.update_hair()
H.update_body_parts() H.update_body_parts()
@@ -72,6 +72,7 @@ GLOBAL_LIST_EMPTY(antagonists)
give_antag_moodies() give_antag_moodies()
if(is_banned(owner.current) && replace_banned) if(is_banned(owner.current) && replace_banned)
replace_banned_player() replace_banned_player()
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
/datum/antagonist/proc/is_banned(mob/M) /datum/antagonist/proc/is_banned(mob/M)
if(!M) if(!M)
@@ -134,6 +134,9 @@
else else
to_chat(user, status()) to_chat(user, status())
/obj/machinery/meter/attack_ghost(mob/user)
to_chat(user, status())
/obj/machinery/meter/singularity_pull(S, current_size) /obj/machinery/meter/singularity_pull(S, current_size)
..() ..()
if(current_size >= STAGE_FIVE) if(current_size >= STAGE_FIVE)
@@ -141,6 +144,7 @@
// TURF METER - REPORTS A TILE'S AIR CONTENTS // TURF METER - REPORTS A TILE'S AIR CONTENTS
// why are you yelling? // why are you yelling?
// i hope they aren't mad
/obj/machinery/meter/turf /obj/machinery/meter/turf
/obj/machinery/meter/turf/reattach_to_layer() /obj/machinery/meter/turf/reattach_to_layer()
@@ -377,6 +377,17 @@
air_update_turf() // Update the environment if needed. air_update_turf() // Update the environment if needed.
update_icon() update_icon()
/obj/machinery/portable_atmospherics/canister/attack_ghost(mob/user)
if(user.client)
if(IsAdminGhost(user))
attack_ai(user)
return FALSE
else if(user.client.prefs.inquisitive_ghost)
user.examinate(src)
return FALSE
atmosanalyzer_scan(air_contents, user, src, FALSE)
return FALSE
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ /obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+18
View File
@@ -181,6 +181,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"ipc_screen" = "Sunburst", "ipc_screen" = "Sunburst",
"ipc_antenna" = "None", "ipc_antenna" = "None",
"flavor_text" = "", "flavor_text" = "",
"silicon_flavor_text" = "",
"ooc_text" = "" "ooc_text" = ""
) )
@@ -393,6 +394,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["flavor_text"]]" dat += "[features["flavor_text"]]"
else else
dat += "[TextPreview(features["flavor_text"])]...<BR>" dat += "[TextPreview(features["flavor_text"])]...<BR>"
dat += "<h2>Silicon Flavor Text</h2>"
dat += "<a href='?_src_=prefs;preference=silicon_flavor_text;task=input'><b>Set Silicon Examine Text</b></a><br>"
if(length(features["silicon_flavor_text"]) <= 40)
if(!length(features["silicon_flavor_text"]))
dat += "\[...\]"
else
dat += "[features["silicon_flavor_text"]]"
else
dat += "[TextPreview(features["silicon_flavor_text"])]...<BR>"
dat += "<h2>OOC Text</h2>" dat += "<h2>OOC Text</h2>"
dat += "<a href='?_src_=prefs;preference=ooc_text;task=input'><b>Set OOC Text</b></a><br>" dat += "<a href='?_src_=prefs;preference=ooc_text;task=input'><b>Set OOC Text</b></a><br>"
if(length(features["ooc_text"]) <= 40) if(length(features["ooc_text"]) <= 40)
@@ -1711,6 +1721,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
msg = msg msg = msg
features["flavor_text"] = msg features["flavor_text"] = msg
if("silicon_flavor_text")
var/msg = stripped_multiline_input(usr, "Set the silicon flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Silicon Flavor Text", features["silicon_flavor_text"], MAX_FLAVOR_LEN, TRUE)
if(msg)
msg = msg
features["silicon_flavor_text"] = msg
if("ooc_text") if("ooc_text")
var/msg = stripped_multiline_input(usr, "Set the OOC text in your 'examine' verb. This should be OOC only!", "OOC Text", html_decode(features["ooc_text"]), MAX_MESSAGE_LEN, TRUE) var/msg = stripped_multiline_input(usr, "Set the OOC text in your 'examine' verb. This should be OOC only!", "OOC Text", html_decode(features["ooc_text"]), MAX_MESSAGE_LEN, TRUE)
if(msg) if(msg)
@@ -2754,6 +2770,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
character.Digitigrade_Leg_Swap(TRUE) character.Digitigrade_Leg_Swap(TRUE)
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
//speech stuff //speech stuff
if(custom_tongue != "default") if(custom_tongue != "default")
var/new_tongue = GLOB.roundstart_tongues[custom_tongue] var/new_tongue = GLOB.roundstart_tongues[custom_tongue]
@@ -436,6 +436,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"] S["feature_flavor_text"] >> features["flavor_text"]
S["feature_silicon_flavor_text"] >> features["silicon_flavor_text"]
if((S["ooc_text"] != "") && (S["ooc_text"] != null) && S["ooc_text"]) if((S["ooc_text"] != "") && (S["ooc_text"] != null) && S["ooc_text"])
S["ooc_text"] >> features["ooc_text"] S["ooc_text"] >> features["ooc_text"]
@@ -513,6 +514,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default") custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default")
custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default") custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default")
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
@@ -796,6 +796,7 @@
item_color = "greenplaidshirt" item_color = "greenplaidshirt"
body_parts_covered = CHEST|GROIN|ARMS|LEGS body_parts_covered = CHEST|GROIN|ARMS|LEGS
can_adjust = FALSE can_adjust = FALSE
fitted = NO_FEMALE_UNIFORM
//yes //yes
//Enzo_Leon patron stuff //Enzo_Leon patron stuff
+1
View File
@@ -4,6 +4,7 @@
max_occurrences = 1 max_occurrences = 1
weight = 4 weight = 4
earliest_start = 5 MINUTES earliest_start = 5 MINUTES
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode) /datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode)
if(!CONFIG_GET(flag/starlight)) if(!CONFIG_GET(flag/starlight))
+1
View File
@@ -5,6 +5,7 @@
min_players = 5 //increased min players from 2 to 5 to reduce chances of half the crew dying in a carp breach min_players = 5 //increased min players from 2 to 5 to reduce chances of half the crew dying in a carp breach
earliest_start = 10 MINUTES earliest_start = 10 MINUTES
max_occurrences = 6 max_occurrences = 6
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event/carp_migration /datum/round_event/carp_migration
announceWhen = 3 announceWhen = 3
+1
View File
@@ -3,6 +3,7 @@
typepath = /datum/round_event/meteor_wave/meaty typepath = /datum/round_event/meteor_wave/meaty
weight = 2 weight = 2
max_occurrences = 1 max_occurrences = 1
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event/meteor_wave/meaty /datum/round_event/meteor_wave/meaty
wave_name = "meaty" wave_name = "meaty"
+1
View File
@@ -10,6 +10,7 @@
min_players = 20 min_players = 20
max_occurrences = 3 max_occurrences = 3
earliest_start = 25 MINUTES earliest_start = 25 MINUTES
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event/meteor_wave /datum/round_event/meteor_wave
startWhen = 6 startWhen = 6
+1 -1
View File
@@ -14,7 +14,7 @@
return ..() return ..()
/datum/round_event/pirates /datum/round_event/pirates
startWhen = 60 //2 minutes to answer startWhen = 300 //5 minutes to answer
var/datum/comm_message/threat var/datum/comm_message/threat
var/payoff = 0 var/payoff = 0
var/paid_off = FALSE var/paid_off = FALSE
+2 -1
View File
@@ -3,6 +3,7 @@
typepath = /datum/round_event/grey_tide typepath = /datum/round_event/grey_tide
max_occurrences = 2 max_occurrences = 2
min_players = 5 min_players = 5
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event/grey_tide /datum/round_event/grey_tide
announceWhen = 50 announceWhen = 50
@@ -67,4 +68,4 @@
temp.prison_open() temp.prison_open()
else if(istype(O, /obj/machinery/door_timer)) else if(istype(O, /obj/machinery/door_timer))
var/obj/machinery/door_timer/temp = O var/obj/machinery/door_timer/temp = O
temp.timer_end(forced = TRUE) temp.timer_end(forced = TRUE)
+1
View File
@@ -4,6 +4,7 @@
max_occurrences = 3 max_occurrences = 3
weight = 2 weight = 2
min_players = 2 min_players = 2
map_blacklist = list("LayeniaStation.dmm")
/datum/round_event/wormholes /datum/round_event/wormholes
@@ -540,7 +540,7 @@
/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
name = "Monkey Energy" name = "Monkey Energy"
desc = "Unleash the ape!" desc = "Unleash the ape!"
icon_state = "monkey_energy" icon_state = "menergy"
list_reagents = list(/datum/reagent/consumable/monkey_energy = 50) list_reagents = list(/datum/reagent/consumable/monkey_energy = 50)
foodtype = SUGAR | JUNKFOOD foodtype = SUGAR | JUNKFOOD
price = 3 price = 3
@@ -23,7 +23,7 @@
/obj/machinery/gibber/RefreshParts() /obj/machinery/gibber/RefreshParts()
var/gib_time = 40 var/gib_time = 40
for(var/obj/item/stock_parts/matter_bin/B in component_parts) for(var/obj/item/stock_parts/matter_bin/B in component_parts)
meat_produced += B.rating meat_produced += 1.6 * B.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts) for(var/obj/item/stock_parts/manipulator/M in component_parts)
gib_time -= 5 * M.rating gib_time -= 5 * M.rating
gibtime = gib_time gibtime = gib_time
@@ -1,6 +1,8 @@
GLOBAL_LIST_EMPTY(monkey_recyclers)
/obj/machinery/monkey_recycler /obj/machinery/monkey_recycler
name = "monkey recycler" name = "monkey recycler"
desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does desc = "A machine used for recycling dead monkeys into monkey cubes. You can use a multitool to link it to a xenobiology console. It currently produces 0.2 cubes for every monkey inserted."
icon = 'icons/obj/kitchen.dmi' icon = 'icons/obj/kitchen.dmi'
icon_state = "grinder" icon_state = "grinder"
layer = BELOW_OBJ_LAYER layer = BELOW_OBJ_LAYER
@@ -9,20 +11,29 @@
idle_power_usage = 5 idle_power_usage = 5
active_power_usage = 50 active_power_usage = 50
circuit = /obj/item/circuitboard/machine/monkey_recycler circuit = /obj/item/circuitboard/machine/monkey_recycler
var/grinded = 0 var/stored_matter = 0
var/required_grind = 5 var/cube_production = 0.2
var/cube_production = 1 var/list/connected = list() //Xenobio consoles
/obj/machinery/monkey_recycler/Initialize(mapload)
. = ..()
GLOB.monkey_recyclers += src
/obj/machinery/monkey_recycler/RefreshParts() /obj/machinery/monkey_recycler/Destroy()
var/req_grind = 5 if(src in GLOB.monkey_recyclers)
var/cubes_made = 1 GLOB.monkey_recyclers -= src
for(var/obj/machinery/computer/camera_advanced/xenobio/C in connected)
var/obj/machinery/computer/camera_advanced/xenobio/console = C
console.connected_recycler = null
return ..()
/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled
cube_production = 0
for(var/obj/item/stock_parts/manipulator/B in component_parts) for(var/obj/item/stock_parts/manipulator/B in component_parts)
req_grind -= B.rating cube_production += B.rating * 0.1
for(var/obj/item/stock_parts/matter_bin/M in component_parts) for(var/obj/item/stock_parts/matter_bin/M in component_parts)
cubes_made = M.rating cube_production += M.rating * 0.1
cube_production = cubes_made desc = "A machine used for recycling dead monkeys into monkey cubes. You can use a multitool to link it to a xenobiology console. It currently produces [cube_production] cubes for every monkey inserted."
required_grind = req_grind
src.desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces [cubes_made] cube(s) for every [required_grind] monkey(s) inserted."
/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
@@ -64,17 +75,23 @@
var/offset = prob(50) ? -2 : 2 var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
use_power(500) use_power(500)
grinded++ stored_matter += cube_production
addtimer(VARSET_CALLBACK(src, pixel_x, initial(pixel_x))) addtimer(VARSET_CALLBACK(src, pixel_x, initial(pixel_x)))
addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "<span class='notice'>The machine now has [grinded] monkey\s worth of material stored.</span>")) addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "<span class='notice'>The machine now has [stored_matter] monkey\s worth of material stored.</span>"))
/obj/machinery/monkey_recycler/interact(mob/user) /obj/machinery/monkey_recycler/interact(mob/user)
if(grinded >= required_grind) if(stored_matter >= 1)
to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.</span>") to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.</span>")
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
grinded -= required_grind for(var/i in 1 to max(stored_matter, 1))
for(var/i = 0, i < cube_production, i++) new /obj/item/reagent_containers/food/snacks/monkeycube(loc)
new /obj/item/reagent_containers/food/snacks/monkeycube(src.loc) stored_matter--
to_chat(user, "<span class='notice'>The machine's display flashes that it has [grinded] monkeys worth of material left.</span>") to_chat(user, "<span class='notice'>The machine's display flashes that it has [stored_matter] monkeys worth of material left.</span>")
else else
to_chat(user, "<span class='danger'>The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].</span>") to_chat(user, "<span class='danger'>The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].</span>")
/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I)
if(istype(I))
to_chat(user, "<span class='notice'>You log [src] in the multitool's buffer.</span>")
I.buffer = src
return TRUE
+1 -1
View File
@@ -368,7 +368,7 @@
C.reagents.add_reagent(/datum/reagent/fermi/eigenstate, 30) C.reagents.add_reagent(/datum/reagent/fermi/eigenstate, 30)
if(5) if(5)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"A new familiar for me, and you'll see it's thee!\"</span>") visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"A new familiar for me, and you'll see it's thee!\"</span>")
C.reagents.add_reagent("secretcatchem", 30) C.reagents.add_reagent(/datum/reagent/fermi/secretcatchem, 30)
if(6) if(6)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"While you may not be a ghost, for this sheet you'll always be it's host.\"</span>") visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"While you may not be a ghost, for this sheet you'll always be it's host.\"</span>")
var/mob/living/carbon/human/H = C var/mob/living/carbon/human/H = C
+5 -5
View File
@@ -29,13 +29,13 @@
distill_reagent = /datum/reagent/saltpetre distill_reagent = /datum/reagent/saltpetre
// Laughin' Peas // Laughing Peas
/obj/item/seeds/peas/laugh /obj/item/seeds/peas/laugh
name = "pack of laughin' peas" name = "pack of laughing peas"
desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas." desc = "These seeds give off a very soft purple glow.. they should grow into Laughing Peas."
icon_state = "seed-laughpeas" icon_state = "seed-laughpeas"
species = "laughpeas" species = "laughpeas"
plantname = "Laughin' Peas" plantname = "Laughing Peas"
product = /obj/item/reagent_containers/food/snacks/grown/laugh product = /obj/item/reagent_containers/food/snacks/grown/laugh
maturation = 7 maturation = 7
potency = 10 potency = 10
@@ -53,7 +53,7 @@
/obj/item/reagent_containers/food/snacks/grown/laugh /obj/item/reagent_containers/food/snacks/grown/laugh
seed = /obj/item/seeds/peas/laugh seed = /obj/item/seeds/peas/laugh
name = "pod of laughin' peas" name = "pod of laughing peas"
desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!" desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!"
icon_state = "laughpeas" icon_state = "laughpeas"
filling_color = "#ee7bee" filling_color = "#ee7bee"
+15 -6
View File
@@ -29,13 +29,22 @@ Captain
/datum/job/captain/get_access() /datum/job/captain/get_access()
return get_all_accesses() return get_all_accesses()
/datum/job/captain/announce(mob/living/carbon/human/H) /datum/job/captain/announce(mob/living/carbon/human/H, tried=FALSE)
..() if(!H)
var/displayed_rank = H.client.prefs.alt_titles_preferences[title] return
if(!displayed_rank) if(!H.client && !tried) //Roundstart mobs don't have clients when announce() gets called
displayed_rank = "Captain" SSticker.OnRoundstart(CALLBACK(src, .proc/announce, H, TRUE)) //So we try again...
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[displayed_rank] [H.nameless ? "" : "[H.real_name] "]on deck!")) return
if(tried && !H.client) //We don't want to endlessly call ourselves when we don't have a client
throw EXCEPTION("[H.nameless ? "Captain" : "Captain [H.real_name]"] ([H.x],[H.y],[H.z]) has no client.")
return
var/displayed_rank = H.client.prefs.alt_titles_preferences[title]
if(!displayed_rank) //Default to Captain
displayed_rank = "Captain"
minor_announce("[displayed_rank] [H.nameless ? "" : "[H.real_name] "]on deck!")
..()
/datum/outfit/job/captain /datum/outfit/job/captain
name = "Captain" name = "Captain"
+2 -1
View File
@@ -18,7 +18,7 @@ Clown
minimal_access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE)
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) /datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
. = ..() ..()
H.apply_pref_name("clown", M.client) H.apply_pref_name("clown", M.client)
/datum/outfit/job/clown /datum/outfit/job/clown
@@ -83,6 +83,7 @@ Mime
minimal_access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE)
/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) /datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M)
..()
H.apply_pref_name("mime", M.client) H.apply_pref_name("mime", M.client)
/datum/outfit/job/mime /datum/outfit/job/mime
+1 -1
View File
@@ -66,7 +66,7 @@
//Only override this proc //Only override this proc
//H is usually a human unless an /equip override transformed it //H is usually a human unless an /equip override transformed it
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
//do actions on H but send messages to M as the key may not have been transferred_yet //do actions on H but send messages to M as the key may not have been transferred yet
if(mind_traits) if(mind_traits)
for(var/t in mind_traits) for(var/t in mind_traits)
ADD_TRAIT(H.mind, t, JOB_TRAIT) ADD_TRAIT(H.mind, t, JOB_TRAIT)
+1 -1
View File
@@ -21,7 +21,7 @@ AI
. = H.AIize(latejoin) . = H.AIize(latejoin)
/datum/job/ai/after_spawn(mob/H, mob/M, latejoin) /datum/job/ai/after_spawn(mob/H, mob/M, latejoin)
. = ..() ..()
if(latejoin) if(latejoin)
var/obj/structure/AIcore/latejoin_inactive/lateJoinCore var/obj/structure/AIcore/latejoin_inactive/lateJoinCore
for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores) for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores)
@@ -64,6 +64,14 @@
name = "asteroid snow baseturf editor" name = "asteroid snow baseturf editor"
baseturf = /turf/open/floor/plating/asteroid/snow baseturf = /turf/open/floor/plating/asteroid/snow
/obj/effect/baseturf_helper/asteroid/layenia
name = "layenia baseturf editor"
baseturf = /turf/open/floor/plating/asteroid/layenia
/obj/effect/baseturf_helper/cloud
name = "cloud baseturf editor"
baseturf = /turf/open/chasm/cloud
/obj/effect/baseturf_helper/beach/sand /obj/effect/baseturf_helper/beach/sand
name = "beach sand baseturf editor" name = "beach sand baseturf editor"
baseturf = /turf/open/floor/plating/beach/sand baseturf = /turf/open/floor/plating/beach/sand
@@ -597,7 +597,7 @@
if (H.custom_body_size) //Do they have it set? if (H.custom_body_size) //Do they have it set?
H.resize(H.custom_body_size * 0.01) H.resize(H.custom_body_size * 0.01)
if (H.breedable == TRUE) if (H.breedable == TRUE)
H.impregchance = 30 H.impregchance = 25
. = H . = H
new_character = . new_character = .
if(transfer_after) if(transfer_after)
@@ -17,3 +17,8 @@
name = "Round + Light" name = "Round + Light"
icon_state = "roundlight" icon_state = "roundlight"
/datum/sprite_accessory/snouts/gator
name = "Gator"
icon_state = "gator"
color_src = MATRIXED
+8 -2
View File
@@ -11,14 +11,20 @@
toggle_combat_mode(TRUE, TRUE) toggle_combat_mode(TRUE, TRUE)
. = ..() . = ..()
for(var/T in get_traumas()) for(var/T in get_traumas())
var/datum/brain_trauma/BT = T var/datum/brain_trauma/BT = T
BT.on_death() BT.on_death()
if(SSticker.mode) if(SSticker.mode)
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
//watching someone die is traumatic
for(var/mob/living/carbon/human/H in oview(5, src))
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "death", /datum/mood_event/deathsaw)
if(prob(10)) //10% chance to pump adrenaline into their body
H.jitteriness += 5
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts) /mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
var/atom/Tsec = drop_location() var/atom/Tsec = drop_location()
for(var/mob/M in src) for(var/mob/M in src)
@@ -8,7 +8,6 @@
var/t_is = p_are() var/t_is = p_are()
var/obscure_name var/obscure_name
var/dispSize = round(12*size_multiplier) // gets the character's sprite size percent and converts it to the nearest half foot var/dispSize = round(12*size_multiplier) // gets the character's sprite size percent and converts it to the nearest half foot
var/output = ""
if(isliving(user)) if(isliving(user))
var/mob/living/L = user var/mob/living/L = user
@@ -24,25 +23,13 @@
if (vassDesc != "") if (vassDesc != "")
. += vassDesc . += vassDesc
output = "<center>"
var/list/obscured = check_obscured_slots() var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
if(ishuman(src)) //user just returned, y'know, the user's own species. dumb. if(skipface || get_visible_name() == "Unknown")
var/mob/living/carbon/human/H = src . += "You can't make out what species they are."
if(gender) else
output += "[icon2html('hyperstation/icons/chat/gender.dmi', world, gender)]" . += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]!"
output += "<b>[src.name]</b>"
var/datum/species/pref_species = H.dna.species
if(get_visible_name() == "Unknown") // same as flavor text, but hey it works.
. += "You can't make out what species they are."
else if(skipface)
. += "You can't make out what species they are."
else
. += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!"
output += "([H.dna.custom_species ? H.dna.custom_species : pref_species.name])"
output += "</center>"
//uniform //uniform
if(w_uniform && !(SLOT_W_UNIFORM in obscured)) if(w_uniform && !(SLOT_W_UNIFORM in obscured))
@@ -416,30 +403,9 @@
else if(isobserver(user) && traitstring) else if(isobserver(user) && traitstring)
. += "<span class='info'><b>Traits:</b> [traitstring]</span>" . += "<span class='info'><b>Traits:</b> [traitstring]</span>"
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
if(print_flavor_text())
output += "<br><b>General</b>"
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
. += "...?"
output += "<br>...?"
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
. += "...?"
output += "<br>...?"
else
. += "[print_flavor_text()]"
output += "<br>[url_encode(flavor_text)]"
if(ooc_text)
output += "<br><br><i><b>OOC</b>"
output += "<br>[url_encode(ooc_text)]"
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, msg)
. += "*---------*</span>" . += "*---------*</span>"
//stat panel
if(ishuman(src))
user.client << output(output, "statbrowser:update_examine") //open the examine window
user.client << output(null, "statbrowser:create_mobexamine") //open the examine window
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects! /mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
var/list/dat = list() var/list/dat = list()
if(!pronoun_replacement) if(!pronoun_replacement)
@@ -37,6 +37,8 @@
if(!CONFIG_GET(flag/disable_human_mood)) if(!CONFIG_GET(flag/disable_human_mood))
AddComponent(/datum/component/mood) AddComponent(/datum/component/mood)
AddElement(/datum/element/mob_holder/micro, "micro") AddElement(/datum/element/mob_holder/micro, "micro")
AddElement(/datum/element/flavor_text/carbon, "", "Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "flavor_text")
AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
/mob/living/carbon/human/Destroy() /mob/living/carbon/human/Destroy()
QDEL_NULL(physiology) QDEL_NULL(physiology)
+1 -1
View File
@@ -58,7 +58,7 @@
//H13 custom body size and impregnation //H13 custom body size and impregnation
var/custom_body_size = 100 var/custom_body_size = 100
var/breedable = 0 var/breedable = 0
var/impregchance = 0 var/impregchance = 30
//h13 noncon settings //h13 noncon settings
var/Noncon = 0 var/Noncon = 0
var/ERP = 0 var/ERP = 0
@@ -437,11 +437,11 @@
var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules
if(CD) if(CD)
CD.reagents.add_reagent("drying_agent", 5 * coeff) CD.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff)
var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules
if(CL) if(CL)
CL.reagents.add_reagent("lube", 2 * coeff) CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff)
/obj/item/robot_module/clown /obj/item/robot_module/clown
name = "Clown" name = "Clown"
@@ -55,6 +55,11 @@
diag_hud_set_status() diag_hud_set_status()
diag_hud_set_health() diag_hud_set_health()
/mob/living/silicon/ComponentInitialize()
. = ..()
AddElement(/datum/element/flavor_text, "", "Silicon Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "silicon_flavor_text")
AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
/mob/living/silicon/med_hud_set_health() /mob/living/silicon/med_hud_set_health()
return //we use a different hud return //we use a different hud
@@ -316,9 +316,9 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
to_chat(H, "<span class='userdanger'>WHAT THE FUCK IS THAT?!</span>") to_chat(H, "<span class='userdanger'>WHAT THE FUCK IS THAT?!</span>")
to_chat(H, "<i>.KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH</i>") to_chat(H, "<i>.KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH</i>")
H.playsound_local(src,'sound/hallucinations/im_here1.ogg', 25) H.playsound_local(src,'sound/hallucinations/im_here1.ogg', 25)
H.reagents.add_reagent("mindbreaker", 3) H.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 3)
H.reagents.add_reagent("laughter", 5) H.reagents.add_reagent(/datum/reagent/consumable/laughter, 5)
H.reagents.add_reagent("mercury", 3) H.reagents.add_reagent(/datum/reagent/mercury, 3)
Appear() Appear()
manifested = FALSE manifested = FALSE
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2) addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2)
+5 -11
View File
@@ -240,10 +240,11 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
return FALSE return FALSE
if(!W.mob_can_equip(src, null, slot, disable_warning, bypass_equip_delay_self)) if(!W.mob_can_equip(src, null, slot, disable_warning, bypass_equip_delay_self))
if(store && istype(src, /mob/living/carbon/human)) if(store && istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src equip_to_slot(W, SLOT_IN_BACKPACK, FALSE)
var/obj/item/storage/backpack/BP = H.back return TRUE
if(BP) else if(store && !qdel_on_fail)
return SEND_SIGNAL(BP, COMSIG_TRY_STORAGE_INSERT, W, null, TRUE, TRUE) W.forceMove(get_turf(src))
if(qdel_on_fail) if(qdel_on_fail)
qdel(W) qdel(W)
else if(!disable_warning) else if(!disable_warning)
@@ -524,13 +525,6 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
unset_machine() unset_machine()
src << browse(null, t1) src << browse(null, t1)
if(href_list["flavor_more"])
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", name, replacetext(flavor_text, "\n", "<BR>")), text("window=[];size=500x200", name))
onclose(usr, "[name]")
if(href_list["flavor_change"])
update_flavor_text()
if(href_list["refresh"]) if(href_list["refresh"])
if(machine && in_range(src, usr)) if(machine && in_range(src, usr))
show_inv(machine) show_inv(machine)
-2
View File
@@ -129,9 +129,7 @@
///Whether the mob is updating glide size when movespeed updates or not ///Whether the mob is updating glide size when movespeed updates or not
var/updating_glide_size = TRUE var/updating_glide_size = TRUE
var/flavor_text = ""
var/ooc_text = "" var/ooc_text = ""
var/flavor_text_2 = "" //version of the above that only lasts for the current round.
///////TYPING INDICATORS/////// ///////TYPING INDICATORS///////
/// Set to true if we want to show typing indicators. /// Set to true if we want to show typing indicators.
-25
View File
@@ -2,31 +2,6 @@
////////////////////SUBTLE COMMAND//////////////////// ////////////////////SUBTLE COMMAND////////////////////
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
/mob/proc/update_flavor_text()
set src in usr
if(usr != src)
to_chat(usr, "No.")
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. IC only!", "Flavor Text", html_decode(flavor_text), MAX_MESSAGE_LEN, TRUE)
if(msg)
flavor_text = html_encode(msg)
flavor_text = msg
/mob/proc/warn_flavor_changed()
if(flavor_text && flavor_text != "") // don't spam people that don't use it!
to_chat(src, "<h2 class='alert'>OOC Warning:</h2>")
to_chat(src, "<span class='alert'>Your flavor text is likely out of date! <a href='?src=[REF(src)];flavor_change=1'>Change</a></span>")
/mob/proc/print_flavor_text()
if(flavor_text && flavor_text != "")
// We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
var/msg = html_decode(replacetext(flavor_text, "\n", " "))
if(length_char(msg) <= 40)
return "<span class='notice'>[html_encode(msg)]</span>"
else
return "<span class='notice'>[html_encode(copytext_char(msg, 1, 37))]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
/mob/proc/get_top_level_mob() /mob/proc/get_top_level_mob()
if(istype(src.loc,/mob)&&src.loc!=src) if(istype(src.loc,/mob)&&src.loc!=src)
var/mob/M=src.loc var/mob/M=src.loc
+1 -1
View File
@@ -171,7 +171,7 @@
/turf/open/pool/attackby(obj/item/W, mob/living/user) /turf/open/pool/attackby(obj/item/W, mob/living/user)
if(istype(W, /obj/item/mop) && filled) if(istype(W, /obj/item/mop) && filled)
W.reagents.add_reagent("water", 5) W.reagents.add_reagent(/datum/reagent/water, 5)
to_chat(user, "<span class='notice'>You wet [W] in [src].</span>") to_chat(user, "<span class='notice'>You wet [W] in [src].</span>")
playsound(src, 'sound/effects/slosh.ogg', 25, TRUE) playsound(src, 'sound/effects/slosh.ogg', 25, TRUE)
else else
+2 -2
View File
@@ -18,8 +18,8 @@
var/grumping = 0 // is the engine currently doing grumpy things var/grumping = 0 // is the engine currently doing grumpy things
var/list/grump_prefix = list("an upsetting", "an unsettling", var/list/grump_prefix = list("an upsetting", "an unsettling",
"a scary", "a loud", "a sassy", "a grouchy", "a grumpy", "a scary", "a loud", "a sassy", "a grouchy", "a grumpy",
"an awful", "a horrible", "a despicable", "a pretty rad", "a godawful") "an awful", "a horrible", "a despicable", "a pretty rad", "a godawful, a wocky")
var/list/grump_suffix = list("noise", "racket", "ruckus", "sound", "clatter", "fracas", "hubbub") var/list/grump_suffix = list("noise", "racket", "ruckus", "sound", "clatter", "fracas", "hubbub, slush")
var/sound_engine1 = 'sound/machines/tractor_running.ogg' var/sound_engine1 = 'sound/machines/tractor_running.ogg'
var/sound_engine2 = 'sound/machines/engine_highpower.ogg' var/sound_engine2 = 'sound/machines/engine_highpower.ogg'
var/sound_tractorrev = 'sound/machines/tractorrev.ogg' var/sound_tractorrev = 'sound/machines/tractorrev.ogg'
@@ -337,70 +337,6 @@
construction_time = 600 construction_time = 600
category = list("Durand") category = list("Durand")
//H.O.N.K
/datum/design/honk_chassis
name = "Exosuit Chassis (\"H.O.N.K\")"
id = "honk_chassis"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/chassis/honker
materials = list(MAT_METAL=20000)
construction_time = 100
category = list("H.O.N.K")
/datum/design/honk_torso
name = "Exosuit Torso (\"H.O.N.K\")"
id = "honk_torso"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_torso
materials = list(MAT_METAL=20000,MAT_GLASS=10000,MAT_BANANIUM=10000)
construction_time = 300
category = list("H.O.N.K")
/datum/design/honk_head
name = "Exosuit Head (\"H.O.N.K\")"
id = "honk_head"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_head
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_BANANIUM=5000)
construction_time = 200
category = list("H.O.N.K")
/datum/design/honk_left_arm
name = "Exosuit Left Arm (\"H.O.N.K\")"
id = "honk_left_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_left_arm
materials = list(MAT_METAL=15000,MAT_BANANIUM=5000)
construction_time = 200
category = list("H.O.N.K")
/datum/design/honk_right_arm
name = "Exosuit Right Arm (\"H.O.N.K\")"
id = "honk_right_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_right_arm
materials = list(MAT_METAL=15000,MAT_BANANIUM=5000)
construction_time = 200
category = list("H.O.N.K")
/datum/design/honk_left_leg
name = "Exosuit Left Leg (\"H.O.N.K\")"
id = "honk_left_leg"
build_type = MECHFAB
build_path =/obj/item/mecha_parts/part/honker_left_leg
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
construction_time = 200
category = list("H.O.N.K")
/datum/design/honk_right_leg
name = "Exosuit Right Leg (\"H.O.N.K\")"
id = "honk_right_leg"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/honker_right_leg
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
construction_time = 200
category = list("H.O.N.K")
//Phazon //Phazon
/datum/design/phazon_chassis /datum/design/phazon_chassis
@@ -464,16 +464,6 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
export_price = 5000 export_price = 5000
/////////////////////////Clown tech/////////////////////////
/datum/techweb_node/clown
id = "clown"
display_name = "Clown Technology"
description = "Honk?!"
prereq_ids = list("base")
design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm",
"honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
////////////////////////Computer tech//////////////////////// ////////////////////////Computer tech////////////////////////
/datum/techweb_node/comptech /datum/techweb_node/comptech
@@ -1,6 +1,6 @@
//Xenobio control console //Xenobio control console
/mob/camera/aiEye/remote/xenobio /mob/camera/aiEye/remote/xenobio
visible_icon = 1 visible_icon = TRUE
icon = 'icons/obj/abductor.dmi' icon = 'icons/obj/abductor.dmi'
icon_state = "camera_target" icon_state = "camera_target"
var/allowed_area = null var/allowed_area = null
@@ -22,15 +22,11 @@
desc = "A computer used for remotely handling slimes." desc = "A computer used for remotely handling slimes."
networks = list("ss13") networks = list("ss13")
circuit = /obj/item/circuitboard/computer/xenobiology circuit = /obj/item/circuitboard/computer/xenobiology
var/datum/action/innate/slime_place/slime_place_action var/datum/action/innate/hotkey_help/hotkey_help
var/datum/action/innate/slime_pick_up/slime_up_action
var/datum/action/innate/feed_slime/feed_slime_action
var/datum/action/innate/monkey_recycle/monkey_recycle_action
var/datum/action/innate/slime_scan/scan_action
var/datum/action/innate/feed_potion/potion_action
var/datum/component/redirect/listener var/datum/component/redirect/listener
var/obj/machinery/monkey_recycler/connected_recycler
var/list/stored_slimes var/list/stored_slimes
var/obj/item/slimepotion/slime/current_potion var/obj/item/slimepotion/slime/current_potion
var/max_slimes = 5 var/max_slimes = 5
@@ -43,14 +39,13 @@
/obj/machinery/computer/camera_advanced/xenobio/Initialize() /obj/machinery/computer/camera_advanced/xenobio/Initialize()
. = ..() . = ..()
slime_place_action = new hotkey_help = new
slime_up_action = new
feed_slime_action = new
monkey_recycle_action = new
scan_action = new
potion_action = new
stored_slimes = list() stored_slimes = list()
listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del))) listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del)))
for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers)
if(get_area(src) == get_area(recycler))
connected_recycler = recycler
connected_recycler.connected += src
/obj/machinery/computer/camera_advanced/xenobio/Destroy() /obj/machinery/computer/camera_advanced/xenobio/Destroy()
stored_slimes = null stored_slimes = null
@@ -61,45 +56,56 @@
S.forceMove(drop_location()) S.forceMove(drop_location())
return ..() return ..()
/obj/machinery/computer/camera_advanced/xenobio/examine(mob/user)
. = ..()
var/thing = "It has "
if((upgradetier & XENOBIO_UPGRADE_SLIMEADV))
thing += "an advanced slime upgrade disk "
if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
thing += "and a monkey upgrade disk "
else if((upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
thing += "a basic slime upgrade disk "
if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
thing += "and a monkey upgrade disk "
else if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
thing += "a monkey upgrade disk "
else
thing += "no upgrades installed."
. += thing
return
thing += "installed."
. += thing
/obj/machinery/computer/camera_advanced/xenobio/CreateEye() /obj/machinery/computer/camera_advanced/xenobio/CreateEye()
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
eyeobj.origin = src eyeobj.origin = src
eyeobj.visible_icon = 1 eyeobj.visible_icon = TRUE
eyeobj.icon = 'icons/obj/abductor.dmi' eyeobj.icon = 'icons/obj/abductor.dmi'
eyeobj.icon_state = "camera_target" eyeobj.icon_state = "camera_target"
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) /obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
..() ..()
if(slime_up_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC if(hotkey_help)
slime_up_action.target = src hotkey_help.target = src
slime_up_action.Grant(user) hotkey_help.Grant(user)
actions += slime_up_action actions += hotkey_help
if(slime_place_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl)
slime_place_action.target = src RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt)
slime_place_action.Grant(user) RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift)
actions += slime_place_action RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift)
RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl)
RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl)
if(feed_slime_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS /obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user)
feed_slime_action.target = src UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL)
feed_slime_action.Grant(user) UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT)
actions += feed_slime_action UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT)
UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT)
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL)
monkey_recycle_action.target = src UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
monkey_recycle_action.Grant(user) ..()
actions += monkey_recycle_action
if(scan_action)
scan_action.target = src
scan_action.Grant(user)
actions += scan_action
if(potion_action && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
potion_action.target = src
potion_action.Grant(user)
actions += potion_action
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted) /obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
if(current_potion == deleted) if(current_potion == deleted)
@@ -134,135 +140,161 @@
current_potion = O current_potion = O
to_chat(user, "<span class='notice'>You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].</span>") to_chat(user, "<span class='notice'>You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].</span>")
return return
else if(istype(O, /obj/item/multitool))
var/obj/item/multitool/M = O
if(istype(M.buffer))
to_chat(user, "<span class='notice'>You link [src] with [M.buffer] in [M] buffer.</span>")
connected_recycler = M.buffer
connected_recycler += src
return
else
to_chat(user, "<span class='warning'>[M] has no buffer.</span>")
return
..() ..()
/datum/action/innate/slime_place /datum/action/innate/hotkey_help
name = "Place Slimes" name = "Hotkey Help"
icon_icon = 'icons/mob/actions/actions_silicon.dmi' icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_down" button_icon_state = "hotkey_help"
/datum/action/innate/slime_place/Activate() /datum/action/innate/hotkey_help/Activate()
if(!target || !isliving(owner)) if(!target || !isliving(owner))
return return
var/mob/living/C = owner to_chat(owner, "<b>Click shortcuts:</b>")
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.")
var/obj/machinery/computer/camera_advanced/xenobio/X = target to_chat(owner, "Ctrl-click a slime to scan it.")
to_chat(owner, "Alt-click a slime to feed it a potion.")
to_chat(owner, "Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey.")
if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) //
for(var/mob/living/simple_animal/slime/S in X.stored_slimes) // Alternate clicks for slime, monkey and open turf if using a xenobio console
S.forceMove(remote_eye.loc)
//Picks up slime
/mob/living/simple_animal/slime/ShiftClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src)
..()
//Place slimes
/turf/open/ShiftClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src)
..()
//Place monkey
/turf/open/CtrlClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src)
..()
//Pick up monkey
/mob/living/carbon/monkey/CtrlClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src)
..()
// Scans slime
/mob/living/simple_animal/slime/CtrlClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src)
..()
//Feeds a potion to slime
/mob/living/simple_animal/slime/AltClick(mob/user)
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src)
..()
//Picks up slime
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S)
if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
return
if(!GLOB.cameranet.checkTurfVis(S.loc))
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
return
var/area/mobarea = get_area(S.loc)
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
if(stored_slimes.len >= max_slimes)
to_chat(user, "<span class='warning'>Slime storage is full.</span>")
return
if(S.ckey)
to_chat(user, "<span class='warning'>The slime wiggled free!</span>")
return
if(S.buckled)
S.Feedstop(silent = TRUE)
S.visible_message("[S] vanishes in a flash of light!")
S.forceMove(src)
stored_slimes += S
//Place slimes
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T)
if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
return
if(!GLOB.cameranet.checkTurfVis(T))
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
return
var/area/turfarea = get_area(T)
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
if(turfarea.name == X.allowed_area || turfarea.xenobiology_compatible)
for(var/mob/living/simple_animal/slime/S in stored_slimes)
S.forceMove(T)
S.visible_message("[S] warps in!") S.visible_message("[S] warps in!")
X.stored_slimes -= S stored_slimes -= S
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/slime_pick_up //Place monkey
name = "Pick up Slime" /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T)
icon_icon = 'icons/mob/actions/actions_silicon.dmi' if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS))
button_icon_state = "slime_up"
/datum/action/innate/slime_pick_up/Activate()
if(!target || !isliving(owner))
return return
var/mob/living/C = owner if(!GLOB.cameranet.checkTurfVis(T))
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
if(X.stored_slimes.len >= X.max_slimes)
break
if(!S.ckey)
if(S.buckled)
S.Feedstop(silent = TRUE)
S.visible_message("[S] vanishes in a flash of light!")
S.forceMove(X)
X.stored_slimes += S
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/feed_slime
name = "Feed Slimes"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_down"
/datum/action/innate/feed_slime/Activate()
if(!target || !isliving(owner))
return return
var/mob/living/C = owner var/area/turfarea = get_area(T)
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control var/mob/camera/aiEye/remote/xenobio/X = eyeobj
var/obj/machinery/computer/camera_advanced/xenobio/X = target if(turfarea.name == X.allowed_area || turfarea.xenobiology_compatible)
if(monkeys >= 1)
var/mob/living/carbon/monkey/food = new/mob/living/carbon/monkey(T, TRUE, user)
if(!QDELETED(food))
food.LAssailant = user
monkeys = round(monkeys-1, 0.1)
to_chat(user, "[src] now has [monkeys] monkeys stored.")
if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) //Pick up monkey
if(X.monkeys >= 1) /obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M)
var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner) if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS))
if (!QDELETED(food))
food.LAssailant = C
X.monkeys --
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_up"
/datum/action/innate/monkey_recycle/Activate()
if(!target || !isliving(owner))
return return
var/mob/living/C = owner if(!connected_recycler)
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control to_chat(user, "<span class='notice'>There is no connected monkey recycler. You can connect one with a multitool.</span>")
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/carbon/monkey/M in remote_eye.loc)
if(M.stat)
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/slime_scan
name = "Scan Slime"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_scan"
/datum/action/innate/slime_scan/Activate()
if(!target || !isliving(owner))
return return
var/mob/living/C = owner if(!GLOB.cameranet.checkTurfVis(M.loc))
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
slime_scan(S, C)
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/feed_potion
name = "Apply Potion"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_potion"
/datum/action/innate/feed_potion/Activate()
if(!target || !isliving(owner))
return return
var/area/mobarea = get_area(M.loc)
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
if(!M.stat)
return
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
connected_recycler.use_power(500)
monkeys += connected_recycler.cube_production
to_chat(user, "[src] now has [monkeys] monkeys available.")
qdel(M)
var/mob/living/C = owner // Scans slime
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S)
var/obj/machinery/computer/camera_advanced/xenobio/X = target if(!GLOB.cameranet.checkTurfVis(S.loc))
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
if(QDELETED(X.current_potion))
to_chat(owner, "<span class='notice'>No potion loaded.</span>")
return return
var/area/mobarea = get_area(S.loc)
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
slime_scan(S, user)
if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) //Feeds a potion to slime
for(var/mob/living/simple_animal/slime/S in remote_eye.loc) /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S)
X.current_potion.attack(S, C) if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
break return
else if(!GLOB.cameranet.checkTurfVis(S.loc))
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>") to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
return
var/area/mobarea = get_area(S.loc)
if(QDELETED(current_potion))
to_chat(user, "<span class='warning'>No potion loaded.</span>")
return
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
current_potion.attack(S, user)
@@ -11,4 +11,9 @@
/datum/mood_event/kiss /datum/mood_event/kiss
description = "<span class='nicegreen'>Someone kissed me, I feel happy!</span>\n" description = "<span class='nicegreen'>Someone kissed me, I feel happy!</span>\n"
mood_change = 2 mood_change = 2
timeout = 3 MINUTES timeout = 3 MINUTES
/datum/mood_event/deathsaw
description = "<span class='boldwarning'>I saw someone die!</span>\n"
mood_change = -8
timeout = 20 MINUTES //takes a long time to get over
@@ -47,3 +47,38 @@
M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX) M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX)
M.overeatduration = 100 M.overeatduration = 100
ADD_TRAIT(M, TRAIT_FAT, OBESITY) ADD_TRAIT(M, TRAIT_FAT, OBESITY)
/datum/quirk/virile
name = "Virile"
desc = "Either through higher quality sperms, more of them, or just being more horny, your impregnation chance will increase by 20-30%."
value = 0
medical_record_text = "Patient has a higher sperm count."
mob_trait = TRAIT_VIRILE
gain_text = "<span class='notice'>You feel more potent."
lose_text = "<span class='notice'>You feel less potent."
var/ichange = 0
/datum/quirk/virile/add()
ichange = rand(20,30)
quirk_holder.impregchance += ichange
/datum/quirk/virile/remove()
if(quirk_holder)
quirk_holder.impregchance -= ichange
/datum/quirk/macrophile
name = "Macrophile"
desc = "You are attracted to larger people, and being stepped on by them."
value = 0
mob_trait = TRAIT_MACROPHILE
gain_text = "<span class='notice'>You feel attracted to people larger than you."
lose_text = "<span class='notice'>You feel less attracted to people larger than you."
/datum/quirk/microphile
name = "Microphile"
desc = "You are attracted to smaller people, and stepping on them."
value = 0
mob_trait = TRAIT_MICROPHILE
gain_text = "<span class='notice'>You feel attracted to people smaller than you."
lose_text = "<span class='notice'>You feel less attracted to people smaller than you."
+108
View File
@@ -0,0 +1,108 @@
//ported from virgo
/obj/structure/railing
name = "railing"
desc = "A railing to stop people from falling"
icon = 'hyperstation/icons/obj/railings.dmi'
var/icon_modifier = "grey_"
icon_state = "grey_railing0"
density = TRUE
layer = 4
anchored = TRUE
flags_1 = ON_BORDER_1
max_integrity = 250
var/heat_resistance = 800
resistance_flags = ACID_PROOF
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
CanAtmosPass = ATMOS_PASS_PROC
var/real_explosion_block //ignore this, just use explosion_block
var/breaksound = "shatter"
var/hitsound = 'sound/effects/Glasshit.ogg'
rad_insulation = RAD_VERY_LIGHT_INSULATION
rad_flags = RAD_PROTECT_CONTENTS
var/check = 0
/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return 1
if(get_dir(loc, target) == dir)
return !density
return 1
/obj/structure/railing/CheckExit(atom/movable/O, turf/target)
if(istype(O) && (O.pass_flags & PASSGLASS))
return 1
if(get_dir(O.loc, target) == dir)
return 0
return 1
/obj/structure/railing/Initialize()
. = ..()
if(src.anchored)
update_icon(0)
/obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1)
check = 0
//if (!anchored) return
var/Rturn = turn(src.dir, -90)
var/Lturn = turn(src.dir, 90)
for(var/obj/structure/railing/R in src.loc)
if ((R.dir == Lturn) && R.anchored)
check |= 32
if (UpdateNeighbors)
R.update_icon(0)
if ((R.dir == Rturn) && R.anchored)
check |= 2
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Lturn))
if ((R.dir == src.dir) && R.anchored)
check |= 16
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Rturn))
if ((R.dir == src.dir) && R.anchored)
check |= 1
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Lturn + src.dir)))
if ((R.dir == Rturn) && R.anchored)
check |= 64
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Rturn + src.dir)))
if ((R.dir == Lturn) && R.anchored)
check |= 4
if (UpdateNeighbors)
R.update_icon(0)
/obj/structure/railing/update_icon(var/UpdateNeighgors = 1)
NeighborsCheck(UpdateNeighgors)
overlays.Cut()
if (!check || !anchored)//|| !anchored
icon_state = "[icon_modifier]railing0"
else
icon_state = "[icon_modifier]railing1"
if (check & 32)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay")
if ((check & 16) || !(check & 32) || (check & 64))
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l")
if (!(check & 2) || (check & 1) || (check & 4))
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r")
if(check & 4)
switch (src.dir)
if (NORTH)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32)
if (SOUTH)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32)
if (EAST)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32)
if (WEST)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32)
+16
View File
@@ -0,0 +1,16 @@
//not the most effient bot in the world, but it does its job.
/client/proc/discordmessage(input as message)
set category = "Special Verbs"
set name = "Hyperbot Message"
set desc = "Makes the local bot say something in general chat on discord."
if(input)
world.hypermessage(input)
message_admins("[key_name_admin(usr)] has made the Hyperbot post '[input]' in General.")
/world/proc/hypermessage(message)
fdel("Hyperbot/message.txt") //cleaning up old message
if(message)
var botmsg = "![message]"
text2file(botmsg,"Hyperbot/message.txt") //the bot on local reads a new text file and sends it to the discord.
+56
View File
@@ -0,0 +1,56 @@
/mob/living/dancercaptain
name = "Captain Beats"
desc = "A captain cursed to dance for all eternity!"
icon = 'hyperstation/icons/mobs/dancer/captain.dmi'
icon_state = "idle"
var/danceaction = 1
var/lastaction = 0 //when the last action was!
var/actiontime = 4
var/list/dancefloor_turfs
var/list/dancefloor_turfs_types
var/dancefloor_exists = FALSE
/mob/living/dancercaptain/Move(atom/newloc, direct)
if(!danceaction)
if(!(world.time > lastaction))
return // no move for you!
animate(src, pixel_x, pixel_y = pixel_y + 10, time = 0.7, 0)
. = ..()
danceaction = 0 //you did your move
lastaction = world.time+actiontime //next action time
sleep(1)
animate(src, pixel_x, pixel_y = pixel_y - 10, time = 0.7, 0)
sleep(1)
LAZYINITLIST(dancefloor_turfs)
LAZYINITLIST(dancefloor_turfs_types)
if(dancefloor_exists) //remove the old one!
dancefloor_exists = FALSE
for(var/i in 1 to dancefloor_turfs.len)
var/turf/T = dancefloor_turfs[i]
T.ChangeTurf(dancefloor_turfs_types[i])
var/list/funky_turfs = RANGE_TURFS(2, src)
dancefloor_exists = TRUE
var/i = 1
dancefloor_turfs.len = funky_turfs.len
dancefloor_turfs_types.len = funky_turfs.len
for(var/t in funky_turfs)
if(!(istype(t, /turf/closed))) //dont change walls
var/turf/T = t
dancefloor_turfs[i] = T
dancefloor_turfs_types[i] = T.type
T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b)
i++
/mob/living/dancercaptain/Initialize()
. = ..()
lastaction = round(world.time) //round to the nearest second! to keep in beat!
/mob/living/dancercaptain/proc/mtimer()
@@ -32,10 +32,14 @@
if(user.pulling) if(user.pulling)
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>" dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
dat += "(Kiss a partner, or object.)<BR>" dat += "(Kiss a partner, or object.)<BR>"
else
dat += "<span class='linkOff'>Kiss</span></A>"
dat += "(Requires a partner)<BR>"
if(user.pulling)
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want... dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
dat += "(Orgasm over a person or object.)<BR>" dat += "(Orgasm over a person or object.)<BR>"
if(isliving(user.pulling)) if(isliving(user.pulling))
if(iscarbon(user.pulling)) if(iscarbon(user.pulling))
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>" dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
@@ -43,8 +47,13 @@
var/mob/living/carbon/human/H = user.pulling var/mob/living/carbon/human/H = user.pulling
if(H.breedable && P && H) if(H.breedable && P && H)
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [user.pulling]</A>" dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
dat += "(Climax inside another person, knocking them up.)<BR>" dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
else
dat += "<span class='linkOff'>Climax over</span></A>"
dat += "(Requires a partner)<BR>"
dat += "<span class='linkOff'>Climax with</span></A>"
dat += "(Requires a partner)<BR>"
//old code needs to be cleaned //old code needs to be cleaned
if(P) if(P)
@@ -308,8 +317,6 @@ obj/screen/arousal/proc/kiss()
src.visible_message("<span class='notice'>[src] is about to kiss [L]!</span>", \ src.visible_message("<span class='notice'>[src] is about to kiss [L]!</span>", \
"<span class='notice'>You're attempting to kiss [L]!</span>", \ "<span class='notice'>You're attempting to kiss [L]!</span>", \
"<span class='notice'>You're attempting to kiss with something!</span>") "<span class='notice'>You're attempting to kiss with something!</span>")
if(!do_mob(src, L, 2 SECONDS)) //I think two seconds is enough time to pull away if its unwanted.
return
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice. SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice.
//Well done you kissed it/them! //Well done you kissed it/them!
src.visible_message("<span class='notice'>[src] kisses [L]!</span>", \ src.visible_message("<span class='notice'>[src] kisses [L]!</span>", \
@@ -7,6 +7,5 @@
metabolization_rate = 1 * REAGENTS_METABOLISM metabolization_rate = 1 * REAGENTS_METABOLISM
taste_description = "sweetness" taste_description = "sweetness"
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M) //can still be eaten/drank, but will provide no benefits like normal honey. Still good for a food sauce. /datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M)
M.reagents.add_reagent(/datum/reagent/consumable/sugar,2) //metabolisms in the system as sugar.
..() ..()
+31 -4
View File
@@ -44,7 +44,7 @@ mob/living/get_effective_size()
if(size_multiplier == previous_size) if(size_multiplier == previous_size)
return 1 return 1
src.update_transform() //WORK DAMN YOU src.update_transform() //WORK DAMN YOU
src.update_mobsize() src.update_mobsize()
//Going to change the health and speed values too //Going to change the health and speed values too
src.remove_movespeed_modifier(MOVESPEED_ID_SIZE) src.remove_movespeed_modifier(MOVESPEED_ID_SIZE)
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 )) src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 ))
@@ -67,7 +67,7 @@ mob/living/get_effective_size()
if(tmob.pulledby == H) if(tmob.pulledby == H)
return 0 return 0
//Micro is on a table. //Micro is on a table.
var/turf/steppyspot = tmob.loc var/turf/steppyspot = tmob.loc
for(var/thing in steppyspot.contents) for(var/thing in steppyspot.contents)
@@ -91,6 +91,7 @@ mob/living/get_effective_size()
tmob.visible_message("<span class='notice'>[src] carefully slithers around [tmob].</span>", "<span class='notice'>[src]'s huge tail slithers besides you.</span>") tmob.visible_message("<span class='notice'>[src] carefully slithers around [tmob].</span>", "<span class='notice'>[src]'s huge tail slithers besides you.</span>")
else else
tmob.visible_message("<span class='notice'>[src] carefully steps over [tmob].</span>", "<span class='notice'>[src] steps over you carefully.</span>") tmob.visible_message("<span class='notice'>[src] carefully steps over [tmob].</span>", "<span class='notice'>[src] steps over you carefully.</span>")
return 1 return 1
//Smaller person stepping under a larger person //Smaller person stepping under a larger person
@@ -133,7 +134,20 @@ mob/living/get_effective_size()
tmob.visible_message("<span class='danger'>[src] carefully rolls their tail over [tmob]!</span>", "<span class='danger'>[src]'s huge tail rolls over you!</span>") tmob.visible_message("<span class='danger'>[src] carefully rolls their tail over [tmob]!</span>", "<span class='danger'>[src]'s huge tail rolls over you!</span>")
else else
tmob.visible_message("<span class='danger'>[src] carefully steps on [tmob]!</span>", "<span class='danger'>[src] steps onto you with force!</span>") tmob.visible_message("<span class='danger'>[src] carefully steps on [tmob]!</span>", "<span class='danger'>[src] steps onto you with force!</span>")
return 1
//horny traits
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
src.adjustArousalLoss(8)
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
src.mob_climax(forced_climax=TRUE)
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
tmob.adjustArousalLoss(10)
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
tmob.mob_climax(forced_climax=TRUE)
return 1
if(H.a_intent == "harm" && H.canmove && !H.buckled) if(H.a_intent == "harm" && H.canmove && !H.buckled)
now_pushing = 0 now_pushing = 0
@@ -149,6 +163,19 @@ mob/living/get_effective_size()
tmob.visible_message("<span class='danger'>[src] mows down [tmob] under their tail!</span>", "<span class='userdanger'>[src] plows their tail over you mercilessly!</span>") tmob.visible_message("<span class='danger'>[src] mows down [tmob] under their tail!</span>", "<span class='userdanger'>[src] plows their tail over you mercilessly!</span>")
else else
tmob.visible_message("<span class='danger'>[src] slams their foot down on [tmob], crushing them!</span>", "<span class='userdanger'>[src] crushes you under their foot!</span>") tmob.visible_message("<span class='danger'>[src] slams their foot down on [tmob], crushing them!</span>", "<span class='userdanger'>[src] crushes you under their foot!</span>")
//horny traits
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
src.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
src.mob_climax(forced_climax=TRUE)
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
tmob.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
tmob.mob_climax(forced_climax=TRUE)
return 1 return 1
if(H.a_intent == "grab" && H.canmove && !H.buckled) if(H.a_intent == "grab" && H.canmove && !H.buckled)
@@ -215,7 +242,7 @@ mob/living/get_effective_size()
mob_size = 2 //the default human size mob_size = 2 //the default human size
if(size_multiplier > 1) if(size_multiplier > 1)
mob_size = 3 mob_size = 3
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM) //Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
/* /*
/mob/living/proc/sizeinteractioncheck(var/mob/living/tmob) /mob/living/proc/sizeinteractioncheck(var/mob/living/tmob)
+4 -1
View File
@@ -170,7 +170,7 @@
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
var/mob/living/carbon/human/O = C var/mob/living/carbon/human/O = C
O.mob_climax_partner(P, M, TRUE, FALSE, FALSE, TRUE) //climax with their partner remotely! O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) //climax with their partner remotely!
return return
..() ..()
@@ -189,6 +189,9 @@
if(H.dna.species.name == "Slimeperson") // slime nerd if(H.dna.species.name == "Slimeperson") // slime nerd
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime") sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime")
if(H.dna.species.name == "Avian") // bird nerd
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian")
sleeve.color = "#" + H.dna.features["mcolor"] sleeve.color = "#" + H.dna.features["mcolor"]
add_overlay(sleeve) add_overlay(sleeve)
+1 -1
View File
@@ -31,7 +31,7 @@
item_state = "highheels" item_state = "highheels"
icon = 'hyperstation/icons/obj/clothing/shoes.dmi' icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi' alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/highheels/Initialize() /obj/item/clothing/shoes/highheels/Initialize()
. = ..() . = ..()
+55 -1
View File
@@ -124,6 +124,14 @@
icon_state = "commissar_beret" icon_state = "commissar_beret"
item_state = "commissar_beret" item_state = "commissar_beret"
/obj/item/clothing/under/touchinfuzzy
name = "provocative jumpsuit"
desc = "A form fitting jumpsuit with a golden trim zipper! Smells faintly of succubus milk."
icon_state = "touchinfuzzyuni"
item_state = "touchinfuzzyuni"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
fitted = NO_FEMALE_UNIFORM
/obj/item/toy/sword/chloesabre /obj/item/toy/sword/chloesabre
name = "Fleet Commander's Sabre" name = "Fleet Commander's Sabre"
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a syndicate twist." desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a syndicate twist."
@@ -143,4 +151,50 @@
return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre") return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre")
/obj/item/toy/sword/chloesabre/get_worn_belt_overlay(icon_file) /obj/item/toy/sword/chloesabre/get_worn_belt_overlay(icon_file)
return mutable_appearance(icon_file, "darksheath-darksabre") return mutable_appearance(icon_file, "darksheath-darksabre")
/obj/item/mialasscale
name = "Miala's Scale"
desc = "A bright, and familiar, cyan scale from an equally familiar snake being."
icon = 'hyperstation/icons/obj/rewards.dmi'
icon_state = "m_scale"
item_state = "m_scale"
w_class = WEIGHT_CLASS_SMALL
/obj/item/bong/kiseru
name = "black lacquered kiseru"
desc = "it is a black lacquered kiseru with a ornate silver head and mouthpiece, you can feel it's old age as you hold it"
icon = 'hyperstation/icons/obj/rewards.dmi'
icon_state = null
item_state = null
w_class = WEIGHT_CLASS_NORMAL
light_color = "#FFCC66"
icon_off = "pipe"
icon_on = "pipe_lit"
/obj/item/clothing/suit/hooded/occultrobes
name = "Occult Robes"
desc = "I didn't even know they made these in XXS..."
icon_state = "coatwinter"
item_state = "coatwinter"
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
/obj/item/clothing/suit/hooded/occultrobes
name = "occult robes"
desc = "I didn't even know they made these in XXS..."
icon_state = "occultrobes"
hoodtype = /obj/item/clothing/head/hooded/occultrobeshood
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/hooded/occultrobeshood
name = "occult hood"
icon_state = "occultrobeshood"
body_parts_covered = HEAD
cold_protection = HEAD
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR
mutantrace_variation = NO_MUTANTRACE_VARIATION
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 KiB

After

Width:  |  Height:  |  Size: 691 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 427 KiB

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Some files were not shown because too many files have changed in this diff Show More