Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into donoritemmodularization

# Conflicts:
#	code/citadel/custom_loadout/custom_items.dm
#	code/datums/components/riding.dm
#	code/game/objects/items/implants/implantuplink.dm
#	icons/mob/neck.dmi
#	icons/obj/clothing/cloaks.dmi
This commit is contained in:
deathride58
2017-12-08 19:58:41 -05:00
182 changed files with 2740 additions and 736 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
/obj/machinery/vr_sleeper
name = "virtual reality sleeper"
desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds."
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
+1 -1
View File
@@ -111,7 +111,7 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as text|null
msg = trim(msg)
if(!msg)
return
+2 -2
View File
@@ -651,10 +651,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Change View Range"
set desc = "switches between 1x and custom views"
if(view == world.view)
if(view == CONFIG_GET(string/default_view))
change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128))
else
change_view(world.view)
change_view(CONFIG_GET(string/default_view))
log_admin("[key_name(usr)] changed their view range to [view].")
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI
@@ -7,7 +7,7 @@
//list of open turfs adjacent to us
var/list/atmos_adjacent_turfs
//bitfield of dirs in which we are superconducitng
var/atmos_supeconductivity = 0
var/atmos_supeconductivity = NONE
//used to determine whether we should archive
var/archived_cycle = 0
@@ -25,8 +25,7 @@
var/pressure_direction = 0
var/datum/excited_group/excited_group
var/excited = 0
var/recently_active = 0
var/excited = FALSE
var/datum/gas_mixture/turf/air
var/obj/effect/hotspot/active_hotspot
@@ -54,10 +53,10 @@
/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
if(!giver)
return 0
return FALSE
air.merge(giver)
update_visuals()
return 1
return TRUE
/turf/open/remove_air(amount)
var/datum/gas_mixture/ours = return_air()
@@ -83,7 +82,7 @@
/turf/temperature_expose()
if(temperature > heat_capacity)
to_be_destroyed = 1
to_be_destroyed = TRUE
/turf/proc/archive()
temperature_archived = temperature
@@ -102,7 +101,7 @@
#if DM_VERSION >= 513
#warning 512 is stable now for sure, remove the old code
#endif
#if DM_VERSION >= 512
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
@@ -175,64 +174,48 @@
for(var/t in adjacent_turfs)
var/turf/open/enemy_tile = t
if(fire_count > enemy_tile.current_cycle)
enemy_tile.archive()
if(fire_count <= enemy_tile.current_cycle)
continue
enemy_tile.archive()
/******************* GROUP HANDLING START *****************************************************************/
/******************* GROUP HANDLING START *****************************************************************/
var/should_share_air = FALSE
var/datum/gas_mixture/enemy_air = enemy_tile.air
if(enemy_tile.excited)
//cache for sanic speed
var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
if(our_excited_group)
if(enemy_excited_group)
if(our_excited_group != enemy_excited_group)
//combine groups (this also handles updating the excited_group var of all involved turfs)
our_excited_group.merge_groups(enemy_excited_group)
our_excited_group = excited_group //update our cache
should_share_air = TRUE
else
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
our_excited_group.add_turf(enemy_tile) //add enemy to our group
should_share_air = TRUE
var/should_share_air = FALSE
var/datum/gas_mixture/enemy_air = enemy_tile.air
//cache for sanic speed
var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
if(our_excited_group && enemy_excited_group)
if(our_excited_group != enemy_excited_group)
//combine groups (this also handles updating the excited_group var of all involved turfs)
our_excited_group.merge_groups(enemy_excited_group)
our_excited_group = excited_group //update our cache
should_share_air = TRUE
else if(our_air.compare(enemy_air))
if(!enemy_tile.excited)
SSair.add_to_active(enemy_tile)
var/datum/excited_group/EG = our_excited_group || enemy_excited_group || new
if(!our_excited_group)
EG.add_turf(src)
if(!enemy_excited_group)
EG.add_turf(enemy_tile)
our_excited_group = excited_group
should_share_air = TRUE
//air sharing
if(should_share_air)
var/difference = our_air.share(enemy_air, adjacent_turfs_length)
if(difference)
if(difference > 0)
consider_pressure_difference(enemy_tile, difference)
else
if(enemy_excited_group)
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
enemy_excited_group.add_turf(src) //join self to enemy group
our_excited_group = excited_group //update our cache
should_share_air = TRUE
else
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
var/datum/excited_group/EG = new //generate new group
EG.add_turf(src)
EG.add_turf(enemy_tile)
our_excited_group = excited_group //update our cache
should_share_air = TRUE
else
if(our_air.compare(enemy_air)) //compare if
SSair.add_to_active(enemy_tile) //excite enemy
if(our_excited_group)
our_excited_group.add_turf(enemy_tile) //add enemy to group
else
var/datum/excited_group/EG = new //generate new group
EG.add_turf(src)
EG.add_turf(enemy_tile)
our_excited_group = excited_group //update our cache
should_share_air = TRUE
//air sharing
if(should_share_air)
var/difference = our_air.share(enemy_air, adjacent_turfs_length)
if(difference)
if(difference > 0)
consider_pressure_difference(enemy_tile, difference)
else
enemy_tile.consider_pressure_difference(src, -difference)
LAST_SHARE_CHECK
enemy_tile.consider_pressure_difference(src, -difference)
LAST_SHARE_CHECK
/******************* GROUP HANDLING FINISH *********************************************************************/
/******************* GROUP HANDLING FINISH *********************************************************************/
if (planet_atmos) //share our air with the "atmosphere" "above" the turf
var/datum/gas_mixture/G = new
@@ -250,12 +233,8 @@
update_visuals()
var/remove = TRUE
if(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
if(consider_superconductivity(starting = 1))
remove = FALSE
if ((!our_excited_group && remove) || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
|| (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
SSair.remove_from_active(src)
atmos_cooldown = cached_atmos_cooldown
@@ -279,9 +258,9 @@
var/const/PROBABILITY_OFFSET = 25
var/const/PROBABILITY_BASE_PRECENT = 75
set waitfor = 0
. = 0
. = FALSE
if (!anchored && !pulledby)
. = 1
. = TRUE
if (last_high_pressure_movement_air_cycle < SSair.times_fired)
var/move_prob = 100
if (pressure_resistance > 0)
@@ -304,7 +283,6 @@
/datum/excited_group/proc/add_turf(turf/open/T)
turf_list += T
T.excited_group = src
T.recently_active = 1
reset_cooldowns()
/datum/excited_group/proc/merge_groups(datum/excited_group/E)
@@ -328,25 +306,27 @@
dismantle_cooldown = 0
//argument is so world start can clear out any turf differences quickly.
/datum/excited_group/proc/self_breakdown(space_is_all_consuming = 0)
/datum/excited_group/proc/self_breakdown(space_is_all_consuming = FALSE)
var/datum/gas_mixture/A = new
//make local for sanic speed
var/list/A_gases = A.gases
var/list/turf_list = src.turf_list
var/turflen = turf_list.len
var/space_in_group = 0
var/space_in_group = FALSE
for(var/t in turf_list)
var/turf/open/T = t
if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
space_in_group = 1
space_in_group = TRUE
qdel(A)
A = new/datum/gas_mixture/immutable/space()
A = new /datum/gas_mixture/immutable/space()
A_gases = A.gases //update the cache
break
A.merge(T.air)
for(var/id in A_gases)
A_gases[id][MOLES] = A_gases[id][MOLES]/turflen
A_gases[id][MOLES] /= turflen
for(var/t in turf_list)
var/turf/open/T = t
@@ -359,8 +339,7 @@
/datum/excited_group/proc/dismantle()
for(var/t in turf_list)
var/turf/open/T = t
T.excited = 0
T.recently_active = 0
T.excited = FALSE
T.excited_group = null
SSair.active_turfs -= T
garbage_collect()
@@ -432,7 +411,7 @@
//Make sure still hot enough to continue conducting heat
if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)
SSair.active_super_conductivity -= src
return 0
return FALSE
/turf/open/finish_superconduction()
//Conduct with air on my tile if I have it
@@ -442,21 +421,21 @@
/turf/proc/consider_superconductivity()
if(!thermal_conductivity)
return 0
return FALSE
SSair.active_super_conductivity |= src
return 1
return TRUE
/turf/open/consider_superconductivity(starting)
if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
return 0
return FALSE
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
return 0
return FALSE
return ..()
/turf/closed/consider_superconductivity(starting)
if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
return 0
return FALSE
return ..()
/turf/proc/radiate_to_spess() //Radiate excess tile heat to space
@@ -465,7 +444,7 @@
if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER))
var/heat = thermal_conductivity*delta_temperature* \
(heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here
(heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM))
temperature -= heat/heat_capacity
/turf/open/proc/temperature_share_open_to_solid(turf/sharer)
@@ -356,6 +356,9 @@
. = TRUE
if("threshold")
var/env = params["env"]
if(text2path(env))
env = text2path(env)
var/name = params["var"]
var/datum/tlv/tlv = TLV[env]
if(isnull(tlv))
@@ -1,7 +1,7 @@
/obj/machinery/atmospherics/components/unary/thermomachine
name = "thermomachine"
desc = "Heats or cools gas in connected pipes."
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/atmospherics/components/thermomachine.dmi'
icon_state = "freezer"
var/icon_state_on = "cold_on"
var/icon_state_open = "cold_off"
@@ -160,7 +160,6 @@
/obj/machinery/atmospherics/components/unary/thermomachine/freezer
name = "freezer"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "freezer"
icon_state_on = "freezer_1"
icon_state_open = "freezer-o"
@@ -177,7 +176,6 @@
/obj/machinery/atmospherics/components/unary/thermomachine/heater
name = "heater"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "heater"
icon_state_on = "heater_1"
icon_state_open = "heater-o"
+8 -8
View File
@@ -204,7 +204,7 @@
brute_damage = 1000
/obj/effect/mob_spawn/human/alive
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
death = FALSE
roundstart = FALSE //you could use these for alive fake humans on roundstart but this is more common scenario
@@ -243,7 +243,7 @@
mob_type = /mob/living/simple_animal/mouse
death = FALSE
roundstart = FALSE
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
/obj/effect/mob_spawn/cow
@@ -252,7 +252,7 @@
death = FALSE
roundstart = FALSE
mob_gender = FEMALE
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
@@ -274,7 +274,7 @@
roundstart = FALSE
random = TRUE
name = "sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a space doctor!"
assignedrole = "Space Doctor"
@@ -329,7 +329,7 @@
roundstart = FALSE
random = TRUE
name = "bartender sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a space bartender!"
assignedrole = "Space Bartender"
@@ -353,7 +353,7 @@
random = TRUE
mob_name = "Beach Bum"
name = "beach bum sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a beach bum!"
assignedrole = "Beach Bum"
@@ -431,7 +431,7 @@
roundstart = FALSE
mob_name = "Nanotrasen Commander"
name = "sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a Nanotrasen Commander!"
@@ -440,7 +440,7 @@
roundstart = FALSE
mob_name = "Private Security Officer"
name = "sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
faction = "nanotrasenprivate"
flavour_text = "You are a Nanotrasen Private Security Officer!"
@@ -229,7 +229,7 @@
/obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive
name = "sleeper"
mob_name = "Syndicate Snow Operative"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
@@ -17,6 +17,8 @@
var/list/json = json_decode(file2text(json_file))
shenanigans = json["phrases"]
#define TIMEWASTE_MEDAL "Overextended The Joke"
/obj/structure/speaking_tile/interact(mob/user)
if(!isliving(user) || speaking)
return
@@ -45,11 +47,11 @@
SpeakPeace(list("Alright maybe that's <b>too</b> boring.", "I can't keep manually typing these lines out though.", "It's hard to explain but the code structure I'm using is kind of terrible."))
if(10)
SpeakPeace(list("Oh I have an idea!", "Lets outsource this endless banter to Poly!", "Then you'll be able to keep listening to this without getting bored!"))
if(isnull(shenanigans))
if(isnull(shenanigans) || !shenanigans.len)
shenanigans = list("Except the poly file is missing...")
if(11 to 14, 16 to 50, 52 to 99, 103 to 107, 109 to 203, 205 to 249, 252 to 665, 667 to 999, 1001 to 5642)
SpeakPeace(list(pick(shenanigans),pick(shenanigans),pick(shenanigans)))
if(times_spoken_to * 0.1 == round(times_spoken_to * 0.1))
if(times_spoken_to % 10 == 0)
SpeakPeace(list("That's [times_spoken_to] times you've spoken to me by the way."))
if(15)
SpeakPeace(list("See? Isn't this fun?","Now you can mash this for hours without getting bored.","Anyway I'll leave you it."))
@@ -79,6 +81,7 @@
if(1000)
SpeakPeace(list("The ends exists somewhere beyond meaningful milestones.", "There will be no more messages until then.", "You disgust me."))
if(5643)
UnlockMedal(TIMEWASTE_MEDAL,user.client)
var/obj/item/reagent_containers/food/drinks/trophy/gold_cup/never_ends = new(get_turf(user))
never_ends.name = "Overextending The Joke: First Place"
never_ends.desc = "And so we are left alone with our regrets."
@@ -87,7 +90,7 @@
speaking = FALSE
times_spoken_to++
#undef TIMEWASTE_MEDAL
/obj/structure/speaking_tile/proc/SpeakPeace(list/statements)
for(var/i in 1 to statements.len)
say("<span class='deadsay'>[statements[i]]</span>")
+6 -2
View File
@@ -442,7 +442,7 @@ GLOBAL_LIST(external_rsc_urls)
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
var/list/connectiontopic_a = params2list(connectiontopic)
var/list/panic_addr = CONFIG_GET(string/panic_address)
var/list/panic_addr = CONFIG_GET(string/panic_server_address)
if(panic_addr && !connectiontopic_a["redirect"])
var/panic_name = CONFIG_GET(string/panic_server_name)
to_chat(src, "<span class='notice'>Sending you to [panic_name ? panic_name : panic_addr].</span>")
@@ -663,6 +663,9 @@ GLOBAL_LIST(external_rsc_urls)
return FALSE
if ("key")
return FALSE
if("view")
change_view(var_value)
return TRUE
. = ..()
@@ -683,7 +686,8 @@ GLOBAL_LIST(external_rsc_urls)
/client/proc/apply_clickcatcher()
generate_clickcatcher()
void.UpdateGreed(view,view)
var/list/actualview = getviewsize(view)
void.UpdateGreed(actualview[1],actualview[2])
/client/proc/AnnouncePR(announcement)
if(prefs && prefs.chat_toggles & CHAT_PULLR)
+3
View File
@@ -72,6 +72,9 @@
if(!(M.failed_last_breath || M.losebreath))
lung_strength = "healthy"
if(M.stat == DEAD && heart && world.time - M.timeofdeath < DEFIB_TIME_LIMIT * 10)
heart_strength = "<span class='boldannounce'>a faint, fluttery</span>"
var/diagnosis = (body_part == "chest" ? "You hear [heart_strength] pulse and [lung_strength] respiration." : "You faintly hear [heart_strength] pulse.")
user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "<span class='notice'>You place [src] against [M]'s [body_part]. [diagnosis]</span>")
return
@@ -1100,7 +1100,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/proc/toggle_zoom(mob/living/user, force_off = FALSE)
if(zoom || force_off)
user.client.change_view(world.view)
user.client.change_view(CONFIG_GET(string/default_view))
to_chat(user, "<span class='boldnotice'>Disabling smart zooming image enhancement...</span>")
zoom = FALSE
return FALSE
+1 -3
View File
@@ -6,11 +6,9 @@
alertadmins = 0
/datum/round_event/camera_failure
startWhen = 1
endWhen = 2
fakeable = FALSE
/datum/round_event/camera_failure/tick()
/datum/round_event/camera_failure/start()
var/iterations = 1
var/obj/machinery/camera/C = pick(GLOB.cameranet.cameras)
while(prob(round(100/iterations)))
+13 -14
View File
@@ -11,29 +11,29 @@
/datum/round_event/wizard/cursed_items/start()
var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "catgirls2015")
var/list/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_gloves, slot_ears)
var/list/loadout = list()
var/list/loadout[slots_amt]
var/ruins_spaceworthiness
var/ruins_wizard_loadout
loadout.len = 7
switch(item_set)
if("wizardmimic")
loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/head/wizard)
loadout[slot_wear_suit] = /obj/item/clothing/suit/wizrobe
loadout[slot_shoes] = /obj/item/clothing/shoes/sandal/magic
loadout[slot_head] = /obj/item/clothing/head/wizard
ruins_spaceworthiness = 1
if("swords")
loadout[5] = /obj/item/katana/cursed
loadout[slot_hands] = /obj/item/katana/cursed
if("bigfatdoobie")
loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy
loadout[slot_wear_mask] = /obj/item/clothing/mask/cigarette/rollie/trippy
ruins_spaceworthiness = 1
if("boxing")
loadout[4] = /obj/item/clothing/mask/luchador
loadout[6] = /obj/item/clothing/gloves/boxing
loadout[slot_wear_mask] = /obj/item/clothing/mask/luchador
loadout[slot_gloves] = /obj/item/clothing/gloves/boxing
ruins_spaceworthiness = 1
if("voicemodulators")
loadout[4] = /obj/item/clothing/mask/chameleon
loadout[slot_wear_mask] = /obj/item/clothing/mask/chameleon
if("catgirls2015")
loadout[3] = /obj/item/clothing/head/kitty
loadout[slot_head] = /obj/item/clothing/head/kitty
ruins_spaceworthiness = 1
ruins_wizard_loadout = 1
@@ -44,14 +44,13 @@
continue
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
H.gender = FEMALE
var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.gloves, H.ears) //add new slots as needed to back
for(var/i in 1 to loadout.len)
if(loadout[i])
var/obj/item/J = loadout[i]
var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list
H.temporarilyRemoveItemFromInventory(slots[i], TRUE)
H.equip_to_slot_or_del(I, wearslots[i])
I.flags_1 |= NODROP_1
H.dropItemToGround(H.get_item_by_slot(i), TRUE)
H.equip_to_slot_or_del(I, i)
I.flags_1 |= NODROP_1 | DROPDEL_1
I.name = "cursed " + I.name
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
+3 -4
View File
@@ -6,12 +6,11 @@
earliest_start = 0
/datum/round_event/wizard/imposter/start()
for(var/datum/mind/M in SSticker.mode.wizards)
if(!ishuman(M.current))
continue
var/mob/living/carbon/human/W = M.current
var/list/candidates = get_candidates(ROLE_WIZARD)
var/list/candidates = pollGhostCandidates("Would you like to be an imposter wizard?", ROLE_WIZARD)
if(!candidates)
return //Sad Trombone
var/client/C = pick(candidates)
@@ -28,10 +27,10 @@
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
if(!master.wiz_team)
master.create_wiz_team()
var/datum/antagonist/wizard/apprentice/imposter = new(I.mind)
var/datum/antagonist/wizard/apprentice/imposter/imposter = new(I.mind)
imposter.master = M
imposter.wiz_team = master.wiz_team
master.wiz_team += imposter
master.wiz_team.add_member(imposter)
I.mind.add_antag_datum(imposter)
//Remove if possible
SSticker.mode.apprentices += I.mind
+1 -1
View File
@@ -22,7 +22,7 @@
for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead
H.set_species(new_species)
H.real_name = new_species.random_name(H.gender,1)
H.real_name = H.dna.species.random_name(H.gender,1)
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
to_chat(H, "<span class='notice'>You feel somehow... different?</span>")
if(!all_the_same)
+16 -15
View File
@@ -115,6 +115,7 @@
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
B.name = "broken [name]"
if(prob(33))
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
@@ -186,7 +187,7 @@
// Formatting is the same as food.
/obj/item/reagent_containers/food/drinks/coffee
name = "Robust Coffee"
name = "robust coffee"
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
list_reagents = list("coffee" = 30)
@@ -195,7 +196,7 @@
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/ice
name = "Ice Cup"
name = "ice cup"
desc = "Careful, cold ice, do not chew."
icon_state = "coffee"
list_reagents = list("ice" = 30)
@@ -216,12 +217,12 @@
icon_state = "tea_empty"
/obj/item/reagent_containers/food/drinks/mug/tea
name = "Duke Purple Tea"
name = "Duke Purple tea"
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
list_reagents = list("tea" = 30)
/obj/item/reagent_containers/food/drinks/mug/coco
name = "Dutch Hot Coco"
name = "Dutch hot coco"
desc = "Made in Space South America."
list_reagents = list("hot_coco" = 30, "sugar" = 5)
foodtype = SUGAR
@@ -230,7 +231,7 @@
/obj/item/reagent_containers/food/drinks/dry_ramen
name = "Cup Ramen"
name = "cup ramen"
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
icon_state = "ramen"
list_reagents = list("dry_ramen" = 30)
@@ -238,7 +239,7 @@
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/beer
name = "Space Beer"
name = "space beer"
desc = "Beer. In space."
icon_state = "beer"
list_reagents = list("beer" = 30)
@@ -282,7 +283,7 @@
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
B.name = "broken carton"
B.name = "broken [name]"
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
@@ -420,28 +421,28 @@
foodtype = SUGAR
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
name = "T-Borg's Tonic Water"
name = "T-Borg's tonic water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic"
list_reagents = list("tonic" = 50)
foodtype = ALCOHOL
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater
name = "Soda Water"
name = "soda water"
desc = "A can of soda water. Why not make a scotch and soda?"
icon_state = "sodawater"
list_reagents = list("sodawater" = 50)
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
name = "Orange Soda"
name = "orange soda"
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
list_reagents = list("lemon_lime" = 30)
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/New()
..()
name = "Lemon-Lime Soda"
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
. = ..()
name = "lemon-lime soda"
/obj/item/reagent_containers/food/drinks/soda_cans/space_up
name = "Space-Up!"
@@ -485,14 +486,14 @@
list_reagents = list("pwr_game" = 30)
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers
name = "Shambler's Juice"
name = "Shambler's juice"
desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers"
list_reagents = list("shamblers" = 30)
foodtype = SUGAR | JUNKFOOD
/obj/item/reagent_containers/food/drinks/soda_cans/air
name = "Canned Air"
name = "canned air"
desc = "There is no air shortage. Do not drink."
icon_state = "air"
list_reagents = list("nitrogen" = 24, "oxygen" = 6)
@@ -35,10 +35,10 @@
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
else
B.name = "broken carton"
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
B.name = "broken [name]"
transfer_fingerprints_to(B)
qdel(src)
@@ -119,7 +119,7 @@
//Keeping this here for now, I'll ask if I should keep it here.
/obj/item/broken_bottle
name = "Broken Bottle"
name = "broken bottle"
desc = "A bottle with a sharp broken bottom."
icon = 'icons/obj/drinks.dmi'
icon_state = "broken_bottle"
@@ -135,37 +135,37 @@
sharpness = IS_SHARP
/obj/item/reagent_containers/food/drinks/bottle/gin
name = "Griffeater Gin"
name = "Griffeater gin"
desc = "A bottle of high quality gin, produced in the New London Space Station."
icon_state = "ginbottle"
list_reagents = list("gin" = 100)
/obj/item/reagent_containers/food/drinks/bottle/whiskey
name = "Uncle Git's Special Reserve"
name = "Uncle Git's special reserve"
desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
icon_state = "whiskeybottle"
list_reagents = list("whiskey" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka
name = "Tunguska Triple Distilled"
name = "Tunguska triple distilled"
desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
icon_state = "vodkabottle"
list_reagents = list("vodka" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka
name = "Badminka Vodka"
name = "Badminka vodka"
desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
icon_state = "badminka"
list_reagents = list("vodka" = 100)
/obj/item/reagent_containers/food/drinks/bottle/tequila
name = "Caccavo Guaranteed Quality Tequila"
name = "Caccavo guaranteed quality tequila"
desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
icon_state = "tequilabottle"
list_reagents = list("tequila" = 100)
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing
name = "Bottle of Nothing"
name = "bottle of nothing"
desc = "A bottle filled with nothing."
icon_state = "bottleofnothing"
list_reagents = list("nothing" = 100)
@@ -178,13 +178,13 @@
list_reagents = list("patron" = 100)
/obj/item/reagent_containers/food/drinks/bottle/rum
name = "Captain Pete's Cuban Spiced Rum"
name = "Captain Pete's Cuban spiced rum"
desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
icon_state = "rumbottle"
list_reagents = list("rum" = 100)
/obj/item/reagent_containers/food/drinks/bottle/holywater
name = "Flask of Holy Water"
name = "flask of holy water"
desc = "A flask of the chaplain's holy water."
icon_state = "holyflask"
list_reagents = list("holywater" = 100)
@@ -195,39 +195,39 @@
list_reagents = list("hell_water" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vermouth
name = "Goldeneye Vermouth"
name = "Goldeneye vermouth"
desc = "Sweet, sweet dryness~"
icon_state = "vermouthbottle"
list_reagents = list("vermouth" = 100)
/obj/item/reagent_containers/food/drinks/bottle/kahlua
name = "Robert Robust's Coffee Liqueur"
name = "Robert Robust's coffee liqueur"
desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
icon_state = "kahluabottle"
list_reagents = list("kahlua" = 100)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
name = "College Girl Goldschlager"
name = "College Girl goldschlager"
desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
icon_state = "goldschlagerbottle"
list_reagents = list("goldschlager" = 100)
/obj/item/reagent_containers/food/drinks/bottle/cognac
name = "Chateau De Baton Premium Cognac"
name = "Chateau de Baton premium cognac"
desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
list_reagents = list("cognac" = 100)
/obj/item/reagent_containers/food/drinks/bottle/wine
name = "Doublebeard Bearded Special Wine"
name = "Doublebeard's bearded special wine"
desc = "A faint aura of unease and asspainery surrounds the bottle."
icon_state = "winebottle"
list_reagents = list("wine" = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/absinthe
name = "Extra-Strong Absinthe"
name = "extra-strong absinthe"
desc = "An strong alcoholic drink brewed and distributed by"
icon_state = "absinthebottle"
list_reagents = list("absinthe" = 100)
@@ -272,7 +272,7 @@
/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium
name = "Gwyn's Premium Absinthe"
name = "Gwyn's premium absinthe"
desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
icon_state = "absinthepremium"
@@ -280,7 +280,7 @@
return
/obj/item/reagent_containers/food/drinks/bottle/lizardwine
name = "Bottle of lizard wine"
name = "bottle of lizard wine"
desc = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol. Inexplicably popular among command staff."
icon_state = "lizardwine"
list_reagents = list("lizardwine" = 100)
@@ -302,7 +302,7 @@
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
name = "Orange Juice"
name = "orange juice"
desc = "Full of vitamins and deliciousness!"
icon_state = "orangejuice"
item_state = "carton"
@@ -313,7 +313,7 @@
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "Milk Cream"
name = "milk cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
icon_state = "cream"
item_state = "carton"
@@ -324,7 +324,7 @@
foodtype = DAIRY
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
name = "Tomato Juice"
name = "tomato juice"
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
icon_state = "tomatojuice"
item_state = "carton"
@@ -335,7 +335,7 @@
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/limejuice
name = "Lime Juice"
name = "lime juice"
desc = "Sweet-sour goodness."
icon_state = "limejuice"
item_state = "carton"
@@ -380,7 +380,7 @@
foodtype = VEGETABLES | FRIED | DAIRY
/obj/item/reagent_containers/food/snacks/cubannachos
name = "cuban nachos"
name = "Cuban nachos"
desc = "That's some dangerously spicy nachos."
icon_state = "cubannachos"
bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
@@ -4,7 +4,7 @@
/obj/item/reagent_containers/food/snacks/donut
name = "donut"
desc = "Goes great with Robust Coffee."
desc = "Goes great with robust coffee."
icon_state = "donut1"
bitesize = 5
bonus_reagents = list("sugar" = 1)
@@ -253,6 +253,9 @@ em {font-style: normal; font-weight: bold;}
.say {}
.deadsay {color: #5c00e6;}
.binarysay {color: #20c20e; background-color: #000000; display: block;}
.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio {color: #008000;}
.sciradio {color: #993399;}
.comradio {color: #948f02;}
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/machinery/biogenerator
name = "biogenerator"
desc = "Converts plants into biomass, which can be used to construct useful items."
icon = 'icons/obj/biogenerator.dmi'
icon = 'icons/obj/machines/biogenerator.dmi'
icon_state = "biogen-empty"
density = TRUE
anchored = TRUE
+2 -2
View File
@@ -16,9 +16,9 @@
randomize_stats()
..()
if(prob(60))
add_random_reagents()
add_random_reagents(1, 3)
if(prob(50))
add_random_traits()
add_random_traits(1, 2)
add_random_plant_type(35)
/obj/item/reagent_containers/food/snacks/grown/random
+1 -1
View File
@@ -375,7 +375,7 @@
pocell.maxcharge *= CG.rate*1000
pocell.charge = pocell.maxcharge
pocell.name = "[G.name] battery"
pocell.desc = "A rechargeable plant based power cell. This one has a power rating of [DisplayPower(pocell.maxcharge)], and you should not swallow it."
pocell.desc = "A rechargeable plant-based power cell. This one has a rating of [DisplayEnergy(pocell.maxcharge)], and you should not swallow it."
if(G.reagents.has_reagent("plasma", 2))
pocell.rigged = 1
@@ -13,7 +13,7 @@
/obj/item/integrated_circuit/passive/power/solar_cell
name = "tiny photovoltaic cell"
desc = "It's a very tiny solar cell, generally used in calculators."
extended_desc = "The cell generates 1W of power per second in optimal lighting conditions. Less light will result in less power being generated."
extended_desc = "The cell generates 1 W of power in optimal lighting conditions. Less light will result in less power being generated."
icon_state = "solar_cell"
complexity = 8
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
+3 -3
View File
@@ -320,7 +320,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
to_chat(usr, "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>")
return
client.change_view(world.view)
client.change_view(CONFIG_GET(string/default_view))
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.key = key
return 1
@@ -456,7 +456,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Change your view range."
var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT
if(client.view == world.view)
if(client.view == CONFIG_GET(string/default_view))
var/list/views = list()
for(var/i in 7 to max_view)
views |= i
@@ -464,7 +464,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(new_view)
client.change_view(Clamp(new_view, 7, max_view))
else
client.change_view(world.view)
client.change_view(CONFIG_GET(string/default_view))
/mob/dead/observer/verb/add_view_range(input as num)
set name = "Add View Range"
+21 -21
View File
@@ -37,36 +37,36 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
// Location
"ê" = "right hand",
"ä" = "left hand",
"ø" = "intercom",
"ê" = "right hand",
"ä" = "left hand",
"ø" = "intercom",
// Department
"ð" = "department",
"ñ" = "Command",
"ò" = "Science",
"ü" = "Medical",
"ó" = "Engineering",
"û" = "Security",
"ã" = "Supply",
"ì" = "Service",
"ð" = "department",
"ñ" = "Command",
"ò" = "Science",
"ü" = "Medical",
"ó" = "Engineering",
"û" = "Security",
"ã" = "Supply",
"ì" = "Service",
// Faction
"å" = "Syndicate",
"í" = "CentCom",
"å" = "Syndicate",
"í" = "CentCom",
// Species
"è" = "binary",
"ï" = "changeling",
"ô" = "alientalk",
"è" = "binary",
"ï" = "changeling",
"ô" = "alientalk",
// Admin
"ç" = "admin",
"â" = "deadmin",
"ç" = "admin",
"â" = "deadmin",
// Misc
"ù" = "AI Private",
"÷" = "cords"
"ù" = "AI Private",
"÷" = "cords"
))
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
@@ -137,7 +137,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/datum/saymode/SM = SSradio.saymodes[key]
if(key && SM)
if(!SM.handle_message(src, message, language))
if(!SM.handle_message(src, message, language) && !message_mode)
return
+2 -1
View File
@@ -817,7 +817,8 @@
return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override
//AI is carded/shunted
//view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist
return get_dist(src, A) <= client.view
var/list/viewscale = getviewsize(client.view)
return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5)
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
+4 -4
View File
@@ -10,14 +10,14 @@
var/mob/living/silicon/S = src
desig = trim_left(S.designation + " " + S.job)
var/message_a = say_quote(message, get_spans())
var/rendered = "<i><span class='game say'>Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
var/rendered = "Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span>"
for(var/mob/M in GLOB.player_list)
if(M.binarycheck())
if(isAI(M))
var/renderedAI = "<i><span class='game say'>Robotic Talk, <a href='?src=[REF(M)];track=[html_encode(name)]'><span class='name'>[name] ([desig])</span></a> <span class='message'>[message_a]</span></span></i>"
var/renderedAI = "<span class='binarysay'>Robotic Talk, <a href='?src=[REF(M)];track=[html_encode(name)]'><span class='name'>[name] ([desig])</span></a> <span class='message'>[message_a]</span></span>"
to_chat(M, renderedAI)
else
to_chat(M, rendered)
to_chat(M, "<span class='binarysay'>[rendered]</span>")
if(isobserver(M))
var/following = src
// If the AI talks on binary chat, we still want to follow
@@ -26,7 +26,7 @@
var/mob/living/silicon/ai/ai = src
following = ai.eyeobj
var/link = FOLLOW_LINK(M, following)
to_chat(M, "[link] [rendered]")
to_chat(M, "<span class='binarysay'>[link] [rendered]</span>")
/mob/living/silicon/binarycheck()
return 1
@@ -9,8 +9,8 @@
gender = MALE
speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
emote_hear = list("meows", "mews")
emote_see = list("shakes its head", "shivers")
emote_hear = list("meows.", "mews.")
emote_see = list("shakes its head.", "shivers.")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
@@ -2,10 +2,10 @@
/mob/living/simple_animal/hostile/asteroid/fugu
name = "wumborian fugu"
desc = "The wumborian fugu rapidly increases its body mass in order to ward off its prey. Great care should be taken to avoid it while it's in this state as it is nearly invincible, but it cannot maintain its form forever."
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "Fugu"
icon_living = "Fugu"
icon_aggro = "Fugu"
icon = 'icons/mob/lavaland/64x64megafauna.dmi'
icon_state = "Fugu0"
icon_living = "Fugu0"
icon_aggro = "Fugu0"
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
mouse_opacity = MOUSE_OPACITY_OPAQUE
@@ -16,6 +16,7 @@
speed = 0
maxHealth = 50
health = 50
pixel_x = -16
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 0
@@ -30,13 +31,23 @@
gold_core_spawnable = HOSTILE_SPAWN
var/wumbo = 0
var/inflate_cooldown = 0
var/datum/action/innate/fugu/expand/E
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
/mob/living/simple_animal/hostile/asteroid/fugu/Initialize()
. = ..()
E = new
E.Grant(src)
/mob/living/simple_animal/hostile/asteroid/fugu/Destroy()
QDEL_NULL(E)
return ..()
/mob/living/simple_animal/hostile/asteroid/fugu/Life()
if(!wumbo)
inflate_cooldown = max((inflate_cooldown - 1), 0)
if(target && AIStatus == AI_ON)
Inflate()
E.Activate()
..()
/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
@@ -46,42 +57,47 @@
/mob/living/simple_animal/hostile/asteroid/fugu/Aggro()
..()
Inflate()
E.Activate()
/mob/living/simple_animal/hostile/asteroid/fugu/verb/Inflate()
set name = "Inflate"
set category = "Fugu"
set desc = "Temporarily increases your size, and makes you significantly more dangerous and tough."
if(wumbo)
to_chat(src, "<span class='notice'>You're already inflated.</span>")
/datum/action/innate/fugu
icon_icon = 'icons/mob/actions/actions_animal.dmi'
/datum/action/innate/fugu/expand
name = "Inflate"
desc = "Temporarily increases your size, and makes you significantly more dangerous and tough! Do not bully the fugu!"
button_icon_state = "expand"
/datum/action/innate/fugu/expand/Activate()
var/mob/living/simple_animal/hostile/asteroid/fugu/F = owner
if(F.wumbo)
to_chat(F, "<span class='notice'>YOU'RE ALREADY WUMBO!</span>")
return
if(inflate_cooldown)
to_chat(src, "<span class='notice'>We need time to gather our strength.</span>")
if(F.inflate_cooldown)
to_chat(F, "<span class='notice'>You need time to gather your strength.</span>")
return
if(buffed)
to_chat(src, "<span class='notice'>Something is interfering with our growth.</span>")
if(F.buffed)
to_chat(F, "<span class='notice'>Something is interfering with your growth.</span>")
return
wumbo = 1
icon_state = "Fugu_big"
obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
harm_intent_damage = 0
throw_message = "is absorbed by the girth of the"
retreat_distance = null
minimum_distance = 1
move_to_delay = 6
transform *= 2
environment_smash = ENVIRONMENT_SMASH_WALLS
mob_size = MOB_SIZE_LARGE
speed = 1
addtimer(CALLBACK(src, .proc/Deflate), 100)
F.wumbo = 1
F.icon_state = "Fugu1"
F.obj_damage = 60
F.melee_damage_lower = 15
F.melee_damage_upper = 20
F.harm_intent_damage = 0
F.throw_message = "is absorbed by the girth of the"
F.retreat_distance = null
F.minimum_distance = 1
F.move_to_delay = 6
F.environment_smash = ENVIRONMENT_SMASH_WALLS
F.mob_size = MOB_SIZE_LARGE
F.speed = 1
addtimer(CALLBACK(F, /mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate), 100)
/mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate()
if(wumbo)
walk(src, 0)
wumbo = 0
icon_state = "Fugu"
icon_state = "Fugu0"
obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
@@ -90,7 +106,6 @@
retreat_distance = 9
minimum_distance = 9
move_to_delay = 2
transform /= 2
inflate_cooldown = 4
environment_smash = ENVIRONMENT_SMASH_NONE
mob_size = MOB_SIZE_SMALL
+1 -1
View File
@@ -39,7 +39,7 @@
if(client)
client.click_intercept = null
client.change_view(world.view) // Resets the client.view in case it was changed.
client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed.
if(!GLOB.individual_log_list[ckey])
GLOB.individual_log_list[ckey] = logging
+2 -2
View File
@@ -63,9 +63,9 @@
if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
if(.)
to_chat(H, "<span class='notice'>Gained <B>[DisplayPower(.)]</B> of power from [A].</span>")
to_chat(H, "<span class='notice'>Gained <B>[DisplayEnergy(.)]</B> of energy from [A].</span>")
else
to_chat(H, "<span class='danger'>\The [A] has run dry of power, you must find another source!</span>")
to_chat(H, "<span class='danger'>\The [A] has run dry of energy, you must find another source!</span>")
else
. = 0 //as to not cancel attack_hand()
+1 -1
View File
@@ -152,7 +152,7 @@ Contents:
..()
if(s_initialized)
if(user == affecting)
to_chat(user, "All systems operational. Current energy capacity: <B>[DisplayPower(cell.charge)]</B>.")
to_chat(user, "All systems operational. Current energy capacity: <B>[DisplayEnergy(cell.charge)]</B>.")
to_chat(user, "The CLOAK-tech device is <B>[s_active?"active":"inactive"]</B>.")
to_chat(user, "There are <B>[s_bombs]</B> smoke bomb\s remaining.")
to_chat(user, "There are <B>[a_boost]</B> adrenaline booster\s remaining.")
@@ -42,7 +42,7 @@
addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_six(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Primary system status: <B>ONLINE</B>.\nBackup system status: <B>ONLINE</B>.\nCurrent energy capacity: <B>[DisplayPower(cell.charge)]</B>.</span>")
to_chat(U, "<span class='notice'>Primary system status: <B>ONLINE</B>.\nBackup system status: <B>ONLINE</B>.\nCurrent energy capacity: <B>[DisplayEnergy(cell.charge)]</B>.</span>")
addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
+1 -1
View File
@@ -430,7 +430,7 @@ By design, d1 is the smallest direction and d2 is the highest
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
addtimer(CALLBACK(src, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
+1 -1
View File
@@ -29,7 +29,7 @@
START_PROCESSING(SSobj, src)
charge = maxcharge
if(ratingdesc)
desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it."
desc += " This one has a rating of [DisplayEnergy(maxcharge)], and you should not swallow it."
update_icon()
/obj/item/stock_parts/cell/Destroy()
+5 -7
View File
@@ -284,7 +284,6 @@
return ..()
/obj/machinery/light/update_icon()
switch(status) // set icon_states
if(LIGHT_OK)
if(emergency_mode)
@@ -293,18 +292,17 @@
icon_state = "[base_state][on]"
if(LIGHT_EMPTY)
icon_state = "[base_state]-empty"
on = FALSE
if(LIGHT_BURNED)
icon_state = "[base_state]-burned"
on = FALSE
if(LIGHT_BROKEN)
icon_state = "[base_state]-broken"
on = FALSE
return
// update the icon_state and luminosity of the light depending on its state
/obj/machinery/light/proc/update(trigger = 1)
switch(status)
if(LIGHT_BROKEN,LIGHT_BURNED,LIGHT_EMPTY)
on = FALSE
emergency_mode = FALSE
if(on)
if(!light || light.light_range != brightness)
@@ -678,7 +676,7 @@
force = 2
throwforce = 5
w_class = WEIGHT_CLASS_TINY
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/status = LIGHT_OK // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
materials = list(MAT_GLASS=100)
@@ -761,7 +759,7 @@
/obj/item/light/proc/shatter()
if(status == LIGHT_OK || status == LIGHT_BURNED)
src.visible_message("<span class='danger'>[name] shatters.</span>","<span class='italics'>You hear a small glass object shatter.</span>")
visible_message("<span class='danger'>[name] shatters.</span>","<span class='italics'>You hear a small glass object shatter.</span>")
status = LIGHT_BROKEN
force = 5
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
+1 -1
View File
@@ -335,7 +335,7 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
buckled_mob.client.change_view(world.view)
buckled_mob.client.change_view(CONFIG_GET(string/default_view))
auto.Remove(buckled_mob)
. = ..()
+1 -1
View File
@@ -500,7 +500,7 @@
user.client.pixel_x = world.icon_size*_x
user.client.pixel_y = world.icon_size*_y
else
user.client.change_view(world.view)
user.client.change_view(CONFIG_GET(string/default_view))
user.client.pixel_x = 0
user.client.pixel_y = 0
return zoomed
+1 -1
View File
@@ -179,7 +179,7 @@
zoom_animating = 0
animate(current_user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
zoom_current_view_increase = 0
current_user.client.change_view(world.view)
current_user.client.change_view(CONFIG_GET(string/default_view))
zooming_angle = 0
current_zoom_x = 0
current_zoom_y = 0
+5 -3
View File
@@ -396,10 +396,12 @@
var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32
//Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
var/list/screenview = getviewsize(user.client.view)
var/screenviewX = screenview[1] * world.icon_size
var/screenviewY = screenview[2] * world.icon_size
var/ox = round(screenview/2) - user.client.pixel_x //"origin" x
var/oy = round(screenview/2) - user.client.pixel_y //"origin" y
var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x
var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y
angle = Atan2(y - oy, x - ox)
return list(angle, p_x, p_y)
@@ -109,7 +109,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
glass_icon_state = "kahluaglass"
glass_name = "glass of RR Coffee Liquor"
glass_name = "glass of RR coffee liquor"
glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
shot_glass_icon_state = "shotglasscream"
@@ -341,7 +341,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 25
taste_description = "burning cinnamon"
glass_icon_state = "goldschlagerglass"
glass_name = "glass of Goldschlager"
glass_name = "glass of goldschlager"
glass_desc = "100% proof that teen girls will drink anything with gold in it."
shot_glass_icon_state = "shotglassgold"
@@ -396,7 +396,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "cola"
glass_icon_state = "whiskeycolaglass"
glass_name = "Whiskey Cola"
glass_name = "whiskey cola"
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
/datum/reagent/consumable/ethanol/martini
@@ -706,7 +706,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "soda"
glass_icon_state = "whiskeysodaglass2"
glass_name = "Whiskey Soda"
glass_name = "whiskey soda"
glass_desc = "Ultimate refreshment."
/datum/reagent/consumable/ethanol/antifreeze
@@ -785,7 +785,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "tart bitterness"
glass_icon_state = "vodkatonicglass"
glass_name = "Vodka and Tonic"
glass_name = "vodka and tonic"
glass_desc = "For when a gin and tonic isn't Russian enough."
@@ -797,7 +797,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 45
taste_description = "dry, tart lemons"
glass_icon_state = "ginfizzglass"
glass_name = "Gin Fizz"
glass_name = "gin fizz"
glass_desc = "Refreshingly lemony, deliciously dry."
@@ -870,7 +870,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 15
taste_description = "refreshingly cold"
glass_icon_state = "iced_beerglass"
glass_name = "Iced Beer"
glass_name = "iced beer"
glass_desc = "A beer so frosty, the air around it freezes."
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
@@ -1069,7 +1069,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 35
taste_description = "sour lemons"
glass_icon_state = "whiskey_sour"
glass_name = "Whiskey Sour"
glass_name = "whiskey sour"
glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying."
/datum/reagent/consumable/ethanol/hcider
@@ -1081,7 +1081,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 25
taste_description = "apples"
glass_icon_state = "whiskeyglass"
glass_name = "Hard Cider"
glass_name = "hard cider"
glass_desc = "Tastes like autumn."
shot_glass_icon_state = "shotglassbrown"
@@ -1279,5 +1279,5 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 1
taste_description = "custard and alcohol"
glass_icon_state = "glass_yellow"
glass_name = "Eggnog"
glass_name = "eggnog"
glass_desc = "For enjoying the most wonderful time of the year."
@@ -148,7 +148,7 @@
description = "Absolutely nothing."
taste_description = "nothing"
glass_icon_state = "nothing"
glass_name = "Nothing"
glass_name = "nothing"
glass_desc = "Absolutely nothing."
shot_glass_icon_state = "shotglass"
@@ -319,7 +319,7 @@
nutriment_factor = 0
taste_description = "bitter coldness"
glass_icon_state = "icedcoffeeglass"
glass_name = "Iced Coffee"
glass_name = "iced coffee"
glass_desc = "A drink to perk you up and refresh you!"
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/M)
@@ -340,7 +340,7 @@
nutriment_factor = 0
taste_description = "sweet tea"
glass_icon_state = "icedteaglass"
glass_name = "Iced Tea"
glass_name = "iced tea"
glass_desc = "All natural, antioxidant-rich flavour sensation."
/datum/reagent/consumable/icetea/on_mob_life(mob/living/M)
@@ -361,7 +361,7 @@
color = "#100800" // rgb: 16, 8, 0
taste_description = "cola"
glass_icon_state = "glass_brown"
glass_name = "glass of space Cola"
glass_name = "glass of Space Cola"
glass_desc = "A glass of refreshing Space Cola."
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/M)
@@ -377,7 +377,7 @@
color = "#100800" // rgb: 16, 8, 0
taste_description = "the future"
glass_icon_state = "nuka_colaglass"
glass_name = "Nuka Cola"
glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/M)
@@ -434,7 +434,7 @@
color = "#00FF00" // rgb: 0, 255, 0
taste_description = "cherry soda"
glass_icon_state = "space-up_glass"
glass_name = "glass of Space-up"
glass_name = "glass of Space-Up"
glass_desc = "Space-up. It helps you keep your cool."
@@ -450,7 +450,7 @@
color = "#8CFF00" // rgb: 135, 255, 0
taste_description = "tangy lime and lemon soda"
glass_icon_state = "glass_yellow"
glass_name = "glass of Lemon-Lime"
glass_name = "glass of lemon-lime"
glass_desc = "You're pretty certain a real fruit has never actually touched this."
@@ -481,7 +481,7 @@
color = "#f00060" // rgb: 94, 0, 38
taste_description = "carbonated metallic soda"
glass_icon_state = "glass_red"
glass_name = "glass of Shambler's Juice"
glass_name = "glass of Shambler's juice"
glass_desc = "Mmm mm, shambly."
/datum/reagent/consumable/shamblers/on_mob_life(mob/living/M)
@@ -495,7 +495,7 @@
color = "#619494" // rgb: 97, 148, 148
taste_description = "carbonated water"
glass_icon_state = "glass_clear"
glass_name = "glass of Soda Water"
glass_name = "glass of soda water"
glass_desc = "Soda water. Why not make a scotch and soda?"
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/M)
@@ -512,7 +512,7 @@
color = "#0064C8" // rgb: 0, 100, 200
taste_description = "tart and fresh"
glass_icon_state = "glass_clear"
glass_name = "glass of Tonic Water"
glass_name = "glass of tonic water"
glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
/datum/reagent/consumable/tonic/on_mob_life(mob/living/M)
@@ -546,7 +546,7 @@
color = "#664300" // rgb: 102, 67, 0
taste_description = "creamy coffee"
glass_icon_state = "soy_latte"
glass_name = "Soy Latte"
glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage while you're reading."
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/M)
@@ -568,7 +568,7 @@
color = "#664300" // rgb: 102, 67, 0
taste_description = "bitter cream"
glass_icon_state = "cafe_latte"
glass_name = "Cafe Latte"
glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you're reading."
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/M)
@@ -612,7 +612,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "sweet chocolate"
glass_icon_state = "chocolatepudding"
glass_name = "Chocolate Pudding"
glass_name = "chocolate pudding"
glass_desc = "Tasty."
/datum/reagent/consumable/vanillapudding
@@ -623,7 +623,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "sweet vanilla"
glass_icon_state = "vanillapudding"
glass_name = "Vanilla Pudding"
glass_name = "vanilla pudding"
glass_desc = "Tasty."
/datum/reagent/consumable/cherryshake
@@ -634,7 +634,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "creamy cherry"
glass_icon_state = "cherryshake"
glass_name = "Cherry Shake"
glass_name = "cherry shake"
glass_desc = "A cherry flavored milkshake."
/datum/reagent/consumable/bluecherryshake
@@ -645,7 +645,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "creamy blue cherry"
glass_icon_state = "bluecherryshake"
glass_name = "Blue Cherry Shake"
glass_name = "blue cherry shake"
glass_desc = "An exotic blue milkshake."
/datum/reagent/consumable/pumpkin_latte
@@ -656,7 +656,7 @@
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "creamy pumpkin"
glass_icon_state = "pumpkin_latte"
glass_name = "Pumpkin Latte"
glass_name = "pumpkin latte"
glass_desc = "A mix of coffee and pumpkin juice."
/datum/reagent/consumable/gibbfloats
@@ -117,7 +117,7 @@
taste_description = "water"
var/cooling_temperature = 2
glass_icon_state = "glass_clear"
glass_name = "glass of Water"
glass_name = "glass of water"
glass_desc = "The father of all refreshments."
shot_glass_icon_state = "shotglassclear"
@@ -188,7 +188,7 @@
description = "Water blessed by some deity."
color = "#E0E8EF" // rgb: 224, 232, 239
glass_icon_state = "glass_clear"
glass_name = "glass of Holy Water"
glass_name = "glass of holy water"
glass_desc = "A glass of holy water."
/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+4 -20
View File
@@ -27,9 +27,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
"Computer Parts"
)
var/datum/component/material_container/materials
/obj/machinery/r_n_d/circuit_imprinter/Initialize()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE),
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready))
materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0,
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
create_reagents(0)
return ..()
@@ -76,21 +78,3 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
/obj/machinery/r_n_d/circuit_imprinter/disconnect_console()
linked_console.linked_imprinter = null
..()
/obj/machinery/r_n_d/circuit_imprinter/ComponentActivated(datum/component/C)
..()
if(istype(C, /datum/component/material_container))
var/datum/component/material_container/M = C
if(!M.last_insert_success)
return
var/lit = M.last_inserted_type
var/stack_name
if(ispath(lit, /obj/item/ore/bluespace_crystal))
stack_name = "bluespace"
use_power(MINERAL_MATERIAL_AMOUNT / 10)
else
var/obj/item/stack/S = lit
stack_name = initial(S.name)
use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10)))
add_overlay("protolathe_[stack_name]")
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
@@ -800,6 +800,13 @@
build_path = /obj/item/device/slime_scanner
category = list("initial", "Misc")
/datum/design/pet_carrier
name = "Pet Carrier"
id = "pet_carrier"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
build_path = /obj/item/pet_carrier
/datum/design/miniature_power_cell
name = "Light Fixture Battery"
id = "miniature_power_cell"
@@ -4,7 +4,7 @@
/datum/design/basic_cell
name = "Basic Power Cell"
desc = "A basic power cell that holds 1 kW of power."
desc = "A basic power cell that holds 1 MJ of energy."
id = "basic_cell"
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE |MECHFAB
@@ -15,7 +15,7 @@
/datum/design/high_cell
name = "High-Capacity Power Cell"
desc = "A power cell that holds 10 kW of power."
desc = "A power cell that holds 10 MJ of energy."
id = "high_cell"
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
@@ -26,7 +26,7 @@
/datum/design/super_cell
name = "Super-Capacity Power Cell"
desc = "A power cell that holds 20 kW of power."
desc = "A power cell that holds 20 MJ of energy."
id = "super_cell"
req_tech = list("powerstorage" = 3, "materials" = 3)
build_type = PROTOLATHE | MECHFAB
@@ -37,7 +37,7 @@
/datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
desc = "A power cell that holds 30 kW of power."
desc = "A power cell that holds 30 MJ of energy."
id = "hyper_cell"
req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
@@ -48,7 +48,7 @@
/datum/design/bluespace_cell
name = "Bluespace Power Cell"
desc = "A power cell that holds 40 kW of power."
desc = "A power cell that holds 40 MJ of energy."
id = "bluespace_cell"
req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE | MECHFAB
+5 -21
View File
@@ -30,12 +30,14 @@ Note: Must be placed west/left of and R&D console to function.
"Computer Parts"
)
var/datum/component/material_container/materials
/obj/machinery/r_n_d/protolathe/Initialize()
create_reagents(0)
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready))
materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
return ..()
@@ -77,21 +79,3 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/disconnect_console()
linked_console.linked_lathe = null
..()
/obj/machinery/r_n_d/protolathe/ComponentActivated(datum/component/C)
..()
if(istype(C, /datum/component/material_container))
var/datum/component/material_container/M = C
if(!M.last_insert_success)
return
var/lit = M.last_inserted_type
var/stack_name
if(ispath(lit, /obj/item/ore/bluespace_crystal))
stack_name = "bluespace"
use_power(MINERAL_MATERIAL_AMOUNT / 10)
else
var/obj/item/stack/S = lit
stack_name = initial(S.name)
use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10)))
add_overlay("protolathe_[stack_name]")
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
+12
View File
@@ -106,3 +106,15 @@
if(loaded_item)
loaded_item.forceMove(loc)
..()
/obj/machinery/r_n_d/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
var/stack_name
if(ispath(type_inserted, /obj/item/ore/bluespace_crystal))
stack_name = "bluespace"
use_power(MINERAL_MATERIAL_AMOUNT / 10)
else
var/obj/item/stack/S = type_inserted
stack_name = initial(S.name)
use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * amount_inserted / 10)))
add_overlay("protolathe_[stack_name]")
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
@@ -12,7 +12,7 @@
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
var/area/new_area = get_area(t)
if(new_area && new_area.name == allowed_area || istype(new_area, /area/science/xenobiology ))
if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
return ..()
else
return
@@ -508,14 +508,14 @@
/obj/item/areaeditor/blueprints/slime
name = "cerulean prints"
desc = "A one use yet of blueprints made of jelly like organic material. Renaming an area to 'Xenobiology Lab' will extend the reach of the management console."
desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console."
color = "#2956B2"
/obj/item/areaeditor/blueprints/slime/edit_area()
var/success = ..()
..()
var/area/A = get_area(src)
if(success)
for(var/turf/T in A)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
qdel(src)
for(var/turf/T in A)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
A.xenobiology_compatible = TRUE
qdel(src)
+1 -1
View File
@@ -97,7 +97,7 @@
name = "Syndicate Bioweapon Scientist"
roundstart = FALSE
death = FALSE
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
flavour_text = "<font size=3>You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Continue your research as best you can, and try to keep a low profile. <font size=6><b>DON'T</b></font> abandon the base without good cause.</b> The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!</b>"
id_access_list = list(ACCESS_SYNDICATE)
+1 -1
View File
@@ -69,7 +69,7 @@
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
user.client.images -= the_eye.placement_images
user.client.images -= the_eye.placed_images
user.client.change_view(world.view)
user.client.change_view(CONFIG_GET(string/default_view))
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot()
if(!checkLandingSpot())
+17 -17
View File
@@ -92,7 +92,7 @@ All ShuttleMove procs go here
return TRUE
// Called on atoms after everything has been moved
/atom/movable/proc/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/atom/movable/proc/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
if(light)
update_light()
if(rotation)
@@ -148,7 +148,7 @@ All ShuttleMove procs go here
A.air_tight = TRUE
INVOKE_ASYNC(A, /obj/machinery/door/.proc/close)
/obj/machinery/door/airlock/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
shuttledocked = 1
for(var/obj/machinery/door/airlock/A in range(1, src))
@@ -160,24 +160,24 @@ All ShuttleMove procs go here
. |= MOVE_CONTENTS
GLOB.cameranet.removeCamera(src)
/obj/machinery/camera/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/camera/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
GLOB.cameranet.addCamera(src)
/obj/machinery/telecomms/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/telecomms/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
listening_level = z // Update listening Z, just in case you have telecomm relay on a shuttle
/obj/machinery/mech_bay_recharge_port/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
/obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
recharging_turf = get_step(loc, dir)
/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(pipe_vision_img)
pipe_vision_img.loc = loc
/obj/machinery/computer/auxillary_base/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/computer/auxillary_base/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery
SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z))
@@ -187,7 +187,7 @@ All ShuttleMove procs go here
on = FALSE
update_list()
/obj/machinery/gravity_generator/main/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/gravity_generator/main/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(charge_count != 0 && charging_state != POWER_UP)
on = TRUE
@@ -198,7 +198,7 @@ All ShuttleMove procs go here
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/missing_nodes = FALSE
for(DEVICE_TYPE_LOOP)
@@ -227,7 +227,7 @@ All ShuttleMove procs go here
// atmosinit() calls update_icon(), so we don't need to call it
update_icon()
/obj/machinery/atmospherics/pipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/atmospherics/pipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
hide(T.intact)
@@ -237,7 +237,7 @@ All ShuttleMove procs go here
GLOB.navbeacons["[z]"] -= src
GLOB.deliverybeacons -= src
/obj/machinery/navbeacon/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
hide(T.intact)
@@ -249,7 +249,7 @@ All ShuttleMove procs go here
GLOB.deliverybeacons += src
GLOB.deliverybeacontags += location
/obj/machinery/power/terminal/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/machinery/power/terminal/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = src.loc
if(level==1)
@@ -257,7 +257,7 @@ All ShuttleMove procs go here
/************************************Item move procs************************************/
/obj/item/storage/pod/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
unlocked = TRUE
// If the pod was launched, the storage will always open.
@@ -269,7 +269,7 @@ All ShuttleMove procs go here
return
. = ..()
/mob/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/mob/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
if(!move_on_shuttle)
return
. = ..()
@@ -279,7 +279,7 @@ All ShuttleMove procs go here
shake_force *= 0.25
shake_camera(src, shake_force, 1)
/mob/living/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/mob/living/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(movement_force && !buckled)
if(movement_force["THROW"])
@@ -307,11 +307,11 @@ All ShuttleMove procs go here
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
/obj/structure/disposalpipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/structure/disposalpipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
update()
/obj/structure/cable/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
/obj/structure/cable/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
if(level==1)
+3 -2
View File
@@ -631,7 +631,7 @@
if(moving_atom.loc != oldT) //fix for multi-tile objects
continue
moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms
moved_atoms += moving_atom
moved_atoms[moving_atom] = oldT
if(move_mode & MOVE_TURF)
oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs
@@ -665,7 +665,8 @@
for(var/i in 1 to moved_atoms.len)
CHECK_TICK
var/atom/movable/moved_object = moved_atoms[i]
moved_object.afterShuttleMove(movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
var/turf/oldT = moved_atoms[moved_object]
moved_object.afterShuttleMove(oldT, movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
for(var/i in 1 to old_turfs.len)
CHECK_TICK
+2 -1
View File
@@ -26,7 +26,8 @@
. = max(., UI_INTERACTIVE)
// Regular ghosts can always at least view if in range.
if(get_dist(src_object, user) < user.client.view)
var/clientviewlist = getviewsize(user.client.view)
if(get_dist(src_object, user) < max(clientviewlist[1],clientviewlist[2]))
. = max(., UI_UPDATE)
// Check if the state allows interaction
+2 -1
View File
@@ -33,7 +33,8 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
return
// Robots can interact with anything they can see.
if(get_dist(src, src_object) <= client.view)
var/list/clientviewlist = getviewsize(client.view)
if(get_dist(src, src_object) <= min(clientviewlist[1],clientviewlist[2]))
return UI_INTERACTIVE
return UI_DISABLED // Otherwise they can keep the UI open.