Merge branch 'master' into vplk-port-pipeland-theta

This commit is contained in:
Leshana
2018-03-28 17:47:21 -04:00
committed by GitHub
253 changed files with 2657 additions and 1110 deletions
+2 -1
View File
@@ -6,7 +6,8 @@ var/global/floorIsLava = 0
////////////////////////////////
/proc/message_admins(var/msg)
msg = "<span class=\"log_message\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[msg]</span></span>"
log_adminwarn(msg)
//log_adminwarn(msg) //log_and_message_admins is for this
for(var/client/C in admins)
if((R_ADMIN|R_MOD) & C.holder.rights)
C << msg
+1 -1
View File
@@ -104,7 +104,7 @@
if(C.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
C << 'sound/effects/adminhelp.ogg'
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
log_adminpm(msg,src,C)
send2adminirc("Reply: [key_name(src)]->[key_name(C)]: [html_decode(msg)]")
//we don't use message_admins here because the sender/receiver might get it too
+2 -1
View File
@@ -285,7 +285,8 @@ var/list/blobs = list()
name = "blob"
desc = "The blob lashing out at something."
icon_state = "blob_attack"
layer = 5.2
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
time_to_die = 6
alpha = 140
mouse_opacity = 0
+1
View File
@@ -22,6 +22,7 @@
var/adminobs = null
var/area = null
var/time_died_as_mouse = null //when the client last died as a mouse
var/datum/tooltip/tooltips = null
var/adminhelped = 0
@@ -282,21 +282,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "<b>Hair</b><br>"
if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair)]'><tr><td>__</td></tr></table></font> "
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><tr><td>__</td></tr></table></font> "
. += " Style: <a href='?src=\ref[src];hair_style=1'>[pref.h_style]</a><br>"
. += "<br><b>Facial</b><br>"
if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial)]'><tr><td>__</td></tr></table></font> "
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><tr><td>__</td></tr></table></font> "
. += " Style: <a href='?src=\ref[src];facial_style=1'>[pref.f_style]</a><br>"
if(has_flag(mob_species, HAS_EYE_COLOR))
. += "<br><b>Eyes</b><br>"
. += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes)]'><tr><td>__</td></tr></table></font><br>"
. += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><tr><td>__</td></tr></table></font><br>"
if(has_flag(mob_species, HAS_SKIN_COLOR))
. += "<br><b>Body Color</b><br>"
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin)]'><tr><td>__</td></tr></table></font><br>"
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><tr><td>__</td></tr></table></font><br>"
. += "<br><a href='?src=\ref[src];marking_style=1'>Body Markings +</a><br>"
for(var/M in pref.body_markings)
@@ -307,7 +307,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "<br>"
. += "<b>Allow Synth color:</b> <a href='?src=\ref[src];synth_color=1'><b>[pref.synth_color ? "Yes" : "No"]</b></a><br>"
if(pref.synth_color)
. += "<a href='?src=\ref[src];synth2_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth)]'><tr><td>__</td></tr></table></font> "
. += "<a href='?src=\ref[src];synth2_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><tr><td>__</td></tr></table></font> "
. = jointext(.,null)
@@ -741,7 +741,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
dat += "<b>Language:</b> [current_species.species_language]<br/>"
dat += "<small>"
if(current_species.spawn_flags & SPECIES_CAN_JOIN)
dat += "</br><b>Often present on human stations.</b>"
switch(current_species.rarity_value)
if(1 to 2)
dat += "</br><b>Often present on human stations.</b>"
if(3 to 4)
dat += "</br><b>Rarely present on human stations.</b>"
if(5)
dat += "</br><b>Unheard of on human stations.</b>"
else
dat += "</br><b>May be present on human stations.</b>"
if(current_species.spawn_flags & SPECIES_IS_WHITELISTED)
dat += "</br><b>Whitelist restricted.</b>"
if(!current_species.has_organ[O_HEART])
@@ -7,24 +7,28 @@
S["UI_style_color"] >> pref.UI_style_color
S["UI_style_alpha"] >> pref.UI_style_alpha
S["ooccolor"] >> pref.ooccolor
S["tooltipstyle"] >> pref.tooltipstyle
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
S["UI_style"] << pref.UI_style
S["UI_style_color"] << pref.UI_style_color
S["UI_style_alpha"] << pref.UI_style_alpha
S["ooccolor"] << pref.ooccolor
S["tooltipstyle"] << pref.tooltipstyle
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color))
pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha))
pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor))
pref.tooltipstyle = sanitize_inlist(pref.tooltipstyle, all_tooltip_styles, initial(pref.tooltipstyle))
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user)
. = "<b>UI Style:</b> <a href='?src=\ref[src];select_style=1'><b>[pref.UI_style]</b></a><br>"
. += "<b>Custom UI</b> (recommended for White UI):<br>"
. += "-Color: <a href='?src=\ref[src];select_color=1'><b>[pref.UI_style_color]</b></a> <table style='display:inline;' bgcolor='[pref.UI_style_color]'><tr><td>__</td></tr></table> <a href='?src=\ref[src];reset=ui'>reset</a><br>"
. += "-Alpha(transparency): <a href='?src=\ref[src];select_alpha=1'><b>[pref.UI_style_alpha]</b></a> <a href='?src=\ref[src];reset=alpha'>reset</a><br>"
. += "<b>Tooltip Style:</b> <a href='?src=\ref[src];select_tooltip_style=1'><b>[pref.tooltipstyle]</b></a><br>"
if(can_select_ooc_color(user))
. += "<b>OOC Color:</b> "
if(pref.ooccolor == initial(pref.ooccolor))
@@ -57,6 +61,12 @@
pref.ooccolor = new_ooccolor
return TOPIC_REFRESH
else if(href_list["select_tooltip_style"])
var/tooltip_style_new = input(user, "Choose tooltip style.", "Character Preference", pref.tooltipstyle) as null|anything in all_tooltip_styles
if(!tooltip_style_new || !CanUseTopic(user)) return TOPIC_NOACTION
pref.tooltipstyle = tooltip_style_new
return TOPIC_REFRESH
else if(href_list["reset"])
switch(href_list["reset"])
if("ui")
@@ -98,6 +98,12 @@ var/list/_client_preferences_by_type
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/mob_tooltips
description ="Mob tooltips"
key = "MOB_TOOLTIPS"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/attack_icons
description ="Attack icons"
key = "ATTACK_ICONS"
@@ -119,7 +125,7 @@ var/list/_client_preferences_by_type
/datum/client_preference/show_typing_indicator/toggled(var/mob/preference_mob, var/enabled)
if(!enabled)
preference_mob.set_typing_indicator(0)
preference_mob.set_typing_indicator(FALSE)
/datum/client_preference/show_ooc
description ="OOC chat"
@@ -94,7 +94,7 @@
if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age))
. += "<del>[rank]</del></td><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
continue
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
if((pref.job_civilian_low & ASSISTANT) && job.flag != ASSISTANT)
. += "<font color=grey>[rank]</font></td><td></td></tr>"
continue
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
@@ -106,7 +106,7 @@
. += "<a href='?src=\ref[src];set_job=[rank]'>"
if(rank == "Assistant")//Assistant is special
if(job.flag == ASSISTANT)//Assistant is special
if(pref.job_civilian_low & ASSISTANT)
. += " <font color=55cc55>\[Yes]</font>"
else
@@ -180,7 +180,7 @@
if(!job)
return 0
if(role == "Assistant")
if(job.flag == ASSISTANT)
if(pref.job_civilian_low & job.flag)
pref.job_civilian_low &= ~job.flag
else
+1
View File
@@ -21,6 +21,7 @@ datum/preferences
var/UI_style = "Midnight"
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/tooltipstyle = "Midnight" //Style for popup tooltips
//character preferences
var/real_name //our character's name
@@ -98,11 +98,11 @@
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see the speech indicator."
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] have the speech indicator."
prefs.save_preferences()
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TTIND") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ahelp_sound()
set name = "Toggle Admin Help Sound"
@@ -192,6 +192,19 @@
feedback_add_details("admin_verb","TFiringMode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_mob_tooltips()
set name = "Toggle Mob Tooltips"
set category = "Preferences"
set desc = "Toggles displaying name/species over mobs when moused over."
var/pref_path = /datum/client_preference/mob_tooltips
toggle_preference(pref_path)
prefs.save_preferences()
src << "You will now [(is_preference_enabled(/datum/client_preference/mob_tooltips)) ? "see" : "not see"] mob tooltips."
feedback_add_details("admin_verb","TMobTooltips") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//Toggles for Staff
//Developers
+9
View File
@@ -20,6 +20,15 @@
"Hologram" = 'icons/mob/screen1_robot_minimalist.dmi'
)
var/global/list/all_tooltip_styles = list(
"Midnight", //Default for everyone is the first one,
"Plasmafire",
"Retro",
"Slimecore",
"Operative",
"Clockwork"
)
/proc/ui_style2icon(ui_style)
if(ui_style in all_ui_styles)
return all_ui_styles[ui_style]
+1 -1
View File
@@ -57,7 +57,7 @@
if (!..())
return 0
if(species_restricted && istype(M,/mob/living/carbon/human))
if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human))
var/exclusive = null
var/wearable = null
var/mob/living/carbon/human/H = M
+201
View File
@@ -0,0 +1,201 @@
//Pilot
/obj/item/clothing/head/pilot
name = "pilot helmet"
desc = "Standard pilot gear. Protects the head from impacts."
icon_state = "pilot_helmet1"
item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi')
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi'
)
flags = THICKMATERIAL
armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0)
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
w_class = ITEMSIZE_NORMAL
var/obj/machinery/computer/shuttle_control/web/shuttle_comp
var/obj/screen/pilot_hud
var/list/images
var/list/raw_images
var/last_status
/obj/item/clothing/head/pilot/initialize()
. = ..()
images = list()
raw_images = list()
pilot_hud = new(src)
pilot_hud.screen_loc = "1,1"
pilot_hud.icon = 'icons/obj/piloting_overlay.dmi'
pilot_hud.icon_state = "dimmer"
pilot_hud.layer = SCREEN_LAYER
pilot_hud.plane = PLANE_FULLSCREEN
pilot_hud.mouse_opacity = 0
pilot_hud.alpha = 0
var/image/I
I = image(pilot_hud.icon,pilot_hud,"top_bar",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 145
images["top_bar"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"top_dots",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 200
images["topdots"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"words_discon",layer=SCREEN_LAYER+1) //words_standby, words_flying, words_spool, words_discon
I.appearance_flags = RESET_ALPHA
I.alpha = 200
images["top_words"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 200
images["charging"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"left_bar",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 0
images["left_bar"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"right_bar",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 0
images["right_bar"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"flyboxes",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 0
images["flyboxes"] = I
raw_images += I
I = image(pilot_hud.icon,pilot_hud,"horizon",layer=SCREEN_LAYER+1)
I.appearance_flags = RESET_ALPHA
I.alpha = 0
images["horizon"] = I
raw_images += I
/obj/item/clothing/head/pilot/proc/update_hud(var/status)
if(last_status == status)
return
last_status = status
if(status == SHUTTLE_INTRANSIT)
var/image/I = images["top_words"]
I.icon_state = "words_flying"
I = images["left_bar"]
I.alpha = 200
I = images["right_bar"]
I.alpha = 200
I = images["flyboxes"]
I.alpha = 200
I = images["horizon"]
I.alpha = 200
I = images["charging"]
I.icon_state = ""
animate(pilot_hud,alpha=255,time=3 SECONDS)
else if(status == SHUTTLE_IDLE)
var/image/I = images["top_words"]
I.icon_state = "words_standby"
I = images["left_bar"]
I.alpha = 0
I = images["right_bar"]
I.alpha = 0
I = images["flyboxes"]
I.alpha = 0
I = images["horizon"]
I.alpha = 0
I = images["charging"]
I.icon_state = ""
animate(pilot_hud,alpha=0,time=3 SECONDS)
else if(status == SHUTTLE_WARMUP)
var/image/I = images["top_words"]
I.icon_state = "words_spool"
I = images["left_bar"]
I.alpha = 200
I = images["right_bar"]
I.alpha = 200
I = images["flyboxes"]
I.alpha = 0
I = images["horizon"]
I.alpha = 0
I = images["charging"]
I.icon_state = "charging"
animate(pilot_hud,alpha=255,time=3 SECONDS)
else if(status == "discon")
var/image/I = images["top_words"]
I.icon_state = "words_discon"
I = images["left_bar"]
I.alpha = 0
I = images["right_bar"]
I.alpha = 0
I = images["flyboxes"]
I.alpha = 0
I = images["horizon"]
I.alpha = 0
I = images["charging"]
I.icon_state = ""
animate(pilot_hud,alpha=0,time=3 SECONDS)
/obj/item/clothing/head/pilot/verb/hud_colors()
set name = "Alter HUD color"
set desc = "Change the color of the piloting HUD."
set category = "Object"
set src in usr
var/newcolor = input(usr,"Pick a color!","HUD Color") as null|color
if(newcolor)
for(var/img in list("top_words","left_bar","right_bar","flyboxes"))
var/image/I = images[img]
I.color = newcolor
/obj/item/clothing/head/pilot/Destroy()
for(var/img in raw_images)
var/image/I = img
I.loc = null
shuttle_comp = null
qdel(pilot_hud)
return ..()
/obj/item/clothing/head/pilot/equipped(var/mob/user,var/slot)
. = ..()
if(slot == slot_head && user.client)
user.client.screen |= pilot_hud
user.client.images |= raw_images
/obj/item/clothing/head/pilot/dropped(var/mob/user)
. = ..()
if(user.client)
user.client.screen -= pilot_hud
user.client.images -= raw_images
/obj/item/clothing/head/pilot/alt
name = "pilot helmet"
desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor"
icon_state = "pilot_helmet2"
action_button_name = "Toggle Visor"
/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob)
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]up"
user << "You raise the visor on the pilot helmet."
else
src.icon_state = initial(icon_state)
user << "You lower the visor on the pilot helmet."
update_clothing_icon() //so our mob-overlays update
+3 -4
View File
@@ -45,7 +45,6 @@
icon_state = "riot"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
siemens_coefficient = 0.5
/obj/item/clothing/suit/armor/riot/alt
@@ -115,7 +114,7 @@
icon_state = "swatarmor"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
flags_inv = HIDETIE|HIDEHOLSTER
slowdown = 1
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
siemens_coefficient = 0.7
@@ -311,7 +310,7 @@
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_jacket"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
flags_inv = HIDETIE|HIDEHOLSTER
/obj/item/clothing/suit/storage/vest/wardencoat/alt
name = "Warden's jacket"
@@ -332,7 +331,7 @@
desc = "A greatcoat enhanced with a special alloy for some protection and style."
icon_state = "hos"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
flags_inv = HIDETIE|HIDEHOLSTER
//Jensen cosplay gear
/obj/item/clothing/suit/storage/vest/hoscoat/jensen
+1 -1
View File
@@ -45,7 +45,7 @@
desc = "A long, flowing white robe. It looks comfortable, but not very warm."
icon_state = "whiteout_robe"
item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white")
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
flags_inv = HIDETIE|HIDEHOLSTER
hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout
//Chaplain
+1
View File
@@ -92,6 +92,7 @@ var/global/economy_init = 0
news_network.CreateFeedChannel("The [using_map.starsys_name] Times", "[using_map.starsys_name] Times ExoNode - [using_map.station_short]", 1, 1)
news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1)
news_network.CreateFeedChannel("Oculum Content Aggregator", "Oculus v6rev7", 1, 1)
for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination)
var/datum/trade_destination/D = new loc_type
+110
View File
@@ -0,0 +1,110 @@
/datum/event/lore_news
endWhen = 10
/datum/event/lore_news/announce()
var/author = "Oculus v6rev7"
var/channel = "Oculum Content Aggregator"
//locations by region for later pick()
//probably would be good to move these to a global somehwere but fuck if I know how to do that
var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes
var/list/crescent = list("Saint Columbia", "Ganesha", "Gavel", "Oasis", "Kess-Gendar") //Vir not included
var/list/core = list("Sol", "Alpha Centauri", "Tau Ceti", "Altair")
var/list/heights = list("New Ohio", "Mahi-Mahi", "Parvati", "Sidhe", "New Seoul")
var/list/bowl = list("Zhu Que", "New Singapore", "Isavau's Gamble", "Love", "Viola", "Stove")
var/list/crypt = list("El", "Jahan's Post", "Abel's Rest", "Raphael", "Thoth", "Terminus")
var/list/weird = list("Silk", "Nyx") //no region
//by government
var/list/solgov = crescent + core + heights + bowl + crypt + weird
var/list/skrell = list("Qerr'Vallis", "Qerma-Lakirr", "Harrqak", "Kauq'xum")
var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon
var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe
var/list/tajara = list("Rarkajar", "Mesomori", "Arathiir")
var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light")
//this is what you should pick for most applications
//whether or not the rim goes there is something that should be changed per the metaplot
var/list/loc = solgov + skrell + tajara
//this includes systems Sol doesn't really have eyes on
var/list/allloc = loc + unathi + skrellfar + independent + rim
//copied right from organizations.dm
var/list/ship_names = list(
"Kestrel",
"Beacon",
"Signal",
"Freedom",
"Glory",
"Axiom",
"Eternal",
"Harmony",
"Light",
"Discovery",
"Endeavor",
"Explorer",
"Swift",
"Dragonfly",
"Ascendant",
"Tenacious",
"Pioneer",
"Hawk",
"Haste",
"Radiant",
"Luminous"
)
//generated based on Cerebulon's thing on the wiki
var/list/prefixes = list("IAV","ICV","IDV","IDV","IEV","IFV","IIV","ILV","IMV","IRV","ISV","ITV","SCG-A","SCG-C","SCG-D","SCG-D","SCG-E","SCG-F","SCG-I","SCG-L","SCG-M","SCG-R","SCG-S","SCG-T","BAV","BCV","BDV","BDV","BEV","BFV","BIV","BLV","BMV","BRV","BSV","BTV","HAV","HCV","HDV","HDV","HEV","HFV","HIV","HLV","HMV","HRV","HSV","HTV","MAV","MCV","MDV","MDV","MEV","MFV","MIV","MLV","MMV","MRV","MSV","MTV","NAV","NCV","NDV","NDV","NEV","NFV","NIV","NLV","NMV","NRV","NSV","NTV","VAV","VCV","VDV","VDV","VEV","VFV","VIV","VLV","VMV","VRV","VSV","VTV","WAV","WCV","WDV","WDV","WEV","WFV","WIV","WLV","WMV","WRV","WSV","WTV","XAV","XCV","XDV","XDV","XEV","XFV","XIV","XLV","XMV","XRV","XSV","XTV","ZAV","ZCV","ZDV","ZDV","ZEV","ZFV","ZIV","ZLV","ZMV","ZRV","ZSV","ZTV","GAV","GCV","GDV","GDV","GEV","GFV","GIV","GLV","GMV","GRV","GSV","GTV","AAV","ACV","ADV","ADV","AEV","AFV","AIV","ALV","AMV","ARV","ASV","ATV","LAV","LCV","LDV","LDV","LEV","LFV","LIV","LLV","LMV","LRV","LSV","LTV")
var/datum/trade_destination/affected_dest = pick(weighted_mundaneevent_locations) //shouldn't do anything, not removing it to avoid breaking shit
//formatting breaks my fucking eyes
var/body = pick("A high-ranking Vey-Med executive was revealed to have been experimenting on biological neural enhancement techniques, believed to be of Skrellian origin, which could lead to the production of transhuman entities with an average cognitive capacity 30% greater than a baseline human.",
"[random_name(MALE)], chairman of the controversial Friends of Ned party, is scheduled to speak at a prominant university in [pick(core)] this Monday, according to a statement on his official newsfeed.",
"A wing of Ward-Takahashi B-class drones became catatonic this Thursday after tripping late-stage anti-emergence protocols. W-T Chief of Development has declined to comment.",
"A brand-new shipment of recreational voidcraft has been deemed \"Unsafe for use\" and seized at [pick(solgov)] customs. Wulf Aeronautics blames error in automated manufactory on [pick(solgov)], assures shareholders of \"One time incident\" after shares drop 4%.",
"Activity in a mostly automated Xion work-site in [pick(solgov)] has been suspended indefinitely, after reports of atypical drone behavior. The EIO's assigned investigator commented on the shutdown, saying \"We'll get them up and running again as soon as we're sure it's safe.\" No comment so far on an estimated time or date of reopening.",
"The EIO has officially raised the Emergence Threat Level in [pick(solgov)] to Blue. Citizens are reminded to comply with all EIO Agent requests. Failure to do so will be met with legal action, up to and including imprisonment.",
"All SolGov citizens beware, the scourge know as the Vox have increased the frequency of their attacks on isolated and poorly defended SolGov territories in [pick(bowl)]. Citizens have been advised to travel in groups and remain aware of their surroundings at all times.",
"The Unathi have recently moved a large amount of material into Abel's Rest, under the premise of building additional power plants. According to our sources, the material is in fact being channeled into domestic terrorist groups on both sides, in an attempt to incite a SolGov response. More news as the story develops.",
"Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2525 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.",
"Amid concerns that it promotes a pro-transtech agenda, a high-profile screening of the award-winning animated film \"The Inventor's Marvelous Mechanical Maidens\" was canceled today on [pick(pick(core, heights))].",
"A radiation leak caused by a power unit rupture at a [pick(solgov)] hazardous materials reclamation plant has left several workers and neighboring residents with acute radiation poisoning. Witnesses report that a basic lifting drone failed to recognize and collided with the misplaced unit.",
"Xenophobic fringe group Humanity First has claimed credit for a bombing at a local government office on [pick(solgov)] which left three seriously injured. Police report that they have two suspects in custody, but details remain sparse.",
"Government official [random_name(MALE)] reports that the crew of the [pick(prefixes)] [pick(ship_names)], the vessel boarded by Jaguar Gang pirates earlier this week, are \"Safe, unharmed, and happy to be back at work.\" Officials were unable to comment on future security measures at this time.",
"Sanitation Technician [random_name(FEMALE)] says she was trapped in her work bathroom for three days after the locking system went haywire! The furious techie says she wants a \"hefty sum\" from her employers and that she won't be visiting that cubicle again any time soon!",
"Experts at a top university have said that almost every position in modern society might be filled by a robot within the next few decades if production continues at its current rate. Workers' Rights groups have expressed alarm at the news, and have called for protections against the \"Tin menace\".",
"An alleged cyberattack on Bishop Cybernetics systems reported to have resulted in the theft of customer data including detailed medical and biological records has been dismissed as \"Unfounded scaremongering\" by company executives.",
"[pick(crescent)] resident [random_name(FEMALE)] says she was overjoyed when her son told her he was planning to get married, but was appalled to find the bride-to-be was a common household cleaning drone! GR3TA assures us that \"Cleaning is complete.\"",
"Striking workers at a manufacturing plant on [pick(bowl)] have returned to work after news spread that plant owners would relocate operations to an automated facility if production did not resume by the end of the month. Factory investor [random_name(FEMALE)] expressed admiration at the \"Decisive action\" taken by the company.",
"Police in [pick(core)] report that they have arrested a man in connection with multinationalist fringe group Nation of Mars. Authorities were alerted when the man's ID was flagged by new screening software at the city spaceport as a known sympathizer with the violent terrorist organization.",
"The mystery of the [pick(prefixes)] [pick(ship_names)] has come to its end as a member of the vessel's skeleton crew was arrested in connection with Golden Tiger activities on the Skrell border. According to authorities, the ship - declared missing some months ago - was illegally sold to criminal elements on its way to breaking yards at [pick(heights)].",
"[random_name(MALE)] comes clean about his decade-long nightmare kept as a slave on Eutopia in a new book to be released later this year. The harried author has fought lawsuits at every turn that claim that his account is \"A work of pure fiction with an obvious leftist agenda.\"",
"Gas mask toting Revolutionary Solar People's Party extremists have reportedly attacked police at a rally in [pick(crypt)]. Peace-keeping officers were viscously pelted with objects and several protesters were found to be equipped with bottles containing an \"unknown substance.\"",
"Be careful what you say around your personal AI device as you never know who might be listening, say top minds! Cybercrime expert [random_name(FEMALE)] says hackers can easily trick your device to listen in on your conversations, record you in secret, or even steal your identity!",
"Thousands of travellers have been stranded at [pick(loc)] spaceport as a major error with the artificial intelligence system purged weeks worth of scheduling and manifest data from the port's mainframe. Major Bill's Transportation is offering stranded passengers 20% off replacement flights.",
"An outraged pet owner claims that a cybernetic company in [pick(solgov)] performed \"disturbing\" surgeries on their beloved cat, Pickles. [random_name(PLURAL)], 58 claims that the local cybernetics firm stole the furry friend from the vet's office and \"Replaced his brain with ones and zeroes.\"",
"Doctors in [pick(pick(skrell, heights))] were left in awe and horror as a Teshari was hatched with the features of an adult human man! Sources say that the youngster hatched with a full head of hair and could recite six nursery rhymes from memory. Could Skrell genetic experiments be to blame?",
"Miners in [pick(bowl)] were dismayed to discover that their boss was actually a C-class drone intelligence! \"I should've known there was something wrong,\" says dumbfounded miner [random_name(MALE)],\"I'd say good morning and he'd just start listing off mineral densities and coordinates. I just thought he loved his job a little too much.\"",
"The remains of an early 22nd century voidcraft containing \"Period artifacts, technology and human remains\" has been located on the surface of Luna after centuries of being disregarded as worthless wreck. Historians hope the find will provide insight into daily life under the short-lived Selene Federation.",
"The unexpected discovery of the remains of a what was believed to be a previously undiscovered species by workers on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")] has now been dismissed. Upon close analysis of the specimen, it was identified as a \"Bear with mange\", apparently dumped there some weeks prior.",
"According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2550 could be at risk from a new virus dubbed \"Cap-3k\".",
"A controversial opera billed as \"The true story of Nos Amis\" has been criticized by law enforcement agencies as \"glorifying\" some of the most infamous gangsters of the 22nd century. The Polish-language \"Z Francji, do Gwiazd\" is to be distributed exclusively in Alpha Centauri for one week only.",
"Injury count continues to rise in the aftermath of the Positronic Rights Group Rally in [pick(pick(bowl, core, heights))]. Homemade teargas grenades were launched into the crowd at approximately 3:45 pm on Saturday by an unidentified person. Authorities urge anyone with information to call in, toll-free, at any time.",
"Representatives report that investigations continue on a string of fires on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")]. While no information has been released to the public, authorities assure the press that they are doing everything in their power to find those responsible.",
"En-route to the contentious rim system, a medical aid mission to Natuna was stopped by Ue-Katish pirates masquerading as refugees, who boarded the ship and stripped it of all supplies.",
"Lead Singer of Strawberry Idol Revealed As Three Teshari In A Trench Coat-- Newest gimmick or shocking revelation??",
"Shocking art critics throughout the system, a recent submission to the [pick(solgov)] Museum of Absurdism's contemporary exhibit was revealed to actually be the nutritional information on the back of a dehydrated cereal product common in Skrell space.",
"The celebrated magical kid series \"Petit Yuusha Jossen Temonila\" has announced its newest season at the height of its demicentenial festival. Noted director [random_name(MALE)] has promised to bring a diverse production staff to the venerable series, and has stated a theme of \"the friendships that transcend borders\".",
"The Hephaestus Industries board of directors announced this Monday the highest annual profits since the height of the Lizard Riots.",
"A radical group of Mercurials were convicted today of violations of Five Points legislature at an extraordinary court on [pick(solgov)]. These convictions come at the heels of a successful sting operation six years in the making, lead by local Head of EIO [random_name(FEMALE)].",
"An unnamed official of the shipping TSC Major Bill's Transportation narrowly escaped an attempt on their life by a deranged assassin. The assassin claims to have been driven to this henious act by the corporation's infamous jingle.",
"In the aftermath of yesterday's synthphobic rally on [pick(solgov)], three positronic citizens were left irreparably damaged by a hostile mob, who claim that the victims were \"AAs\" attempting to infiltrate the rally.",
"EIO spokesperson [random_name(MALE)] stated in a press conference yesterday that the \"Shakespear\" A-class codeline was briefly available for download on the darknet, although they claim to be \"confident that the leak was shut down before any significant portion could be downloaded\". Experts suspect Association involvement.",
"[pick("Strives Towards", "Embraces", "Dreams of", "Cultivates", "Advocates", "Exemplifies")] [pick("Strength", "Wisdom", "Independence", "Pragmatism", "Reason", "Development")], a Community Child from Angessa's Pearl, published his memoir today, detailing a shocking level of abuse by caretakers and educators.",
"Nova Sixty, Mercurial web personality, claims that the disappearence of the SCG-R Song Shi was a plot by \"extradimensional rockmen\" who intend to sow mistrust between the Association and SolGov. Quote Sixty, \"The Far Kingdoms' attempt to hide the TRUTH only proves that they and their rockman allies are NOT to be trusted.\"",
)
news_network.SubmitArticle(body, author, channel, null, 1)
+1
View File
@@ -139,6 +139,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
)
+1
View File
@@ -48,6 +48,7 @@ var/list/event_last_fired = list()
possibleEvents[/datum/event/economic_event] = 300
possibleEvents[/datum/event/trivial_news] = 400
possibleEvents[/datum/event/mundane_news] = 300
possibleEvents[/datum/event/lore_news] = 300 // up this if the above ones get removed as they damn well should
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
+1 -1
View File
@@ -47,7 +47,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.layer = 50
halitem.hud_layerise()
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/gun.dmi'
@@ -51,7 +51,6 @@
density = 0
icon = 'icons/obj/hydroponics_growing.dmi'
icon_state = "bush4-1"
layer = 3
pass_flags = PASSTABLE
mouse_opacity = 2
@@ -192,12 +191,12 @@
icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]"
if(growth>2 && growth == max_growth)
layer = 5
plane = ABOVE_PLANE
set_opacity(1)
if(!isnull(seed.chems["woodpulp"]))
density = 1
else
layer = 3
reset_plane_and_layer()
density = 0
/obj/effect/plant/proc/calc_dir()
@@ -5,7 +5,6 @@
simulated = 0
anchored = 1
icon = LIGHTING_ICON
layer = LIGHTING_LAYER
plane = PLANE_LIGHTING
//invisibility = INVISIBILITY_LIGHTING
color = LIGHTING_BASE_MATRIX
+28 -9
View File
@@ -4,11 +4,13 @@
region. Each is labled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \
articles. You are encouraged to check back frequently."
children = list(
/datum/lore/codex/page/article1,
/datum/lore/codex/page/article2,
/datum/lore/codex/page/article3,
/datum/lore/codex/page/article4,
/datum/lore/codex/page/article7,
/datum/lore/codex/page/article6,
/datum/lore/codex/page/article5,
/datum/lore/codex/page/article4,
/datum/lore/codex/page/article3,
/datum/lore/codex/page/article2,
/datum/lore/codex/page/article1,
/datum/lore/codex/page/about_news,
)
@@ -20,7 +22,7 @@
information, feel free to visit our homepage at oc.about.tsc, or the sites of any of our constituents."
/datum/lore/codex/page/article1
name = "08/30/61-- VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
name = "08/30/61 - VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
data = "Today's meeting of the Vir Bicameral led to the passing of the Wynther-Helsey Bill, an implementation of the legal framework \
used in Aetolus to handle the production and cultivation of the Macrolimbus species dubbed \"Prometheans\". These ill-researched organisms \
possess cognitive abilities easily equaling those of A-class drones, but so far have not been included under the EIO's list of dangerous \
@@ -38,7 +40,7 @@
follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation."
/datum/lore/codex/page/article2
name = "2/3/62-- Corporate Coup on Aetolus"
name = "2/3/62 - Corporate Coup on Aetolus"
data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \
a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\
announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \
@@ -51,7 +53,7 @@
not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself."
/datum/lore/codex/page/article3
name = "2/10/62-- Aetolian Partisans Declare Independence"
name = "2/10/62 - Aetolian Partisans Declare Independence"
data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\
<br><br>\
Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\
@@ -59,7 +61,7 @@
NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna."
/datum/lore/codex/page/article4
name = "2/14/62-- SCG Denounces Aetolian Coup; Mobilizes Fleet"
name = "2/14/62 - SCG Denounces Aetolian Coup; Mobilizes Fleet"
data = "Dismissing claims of inaction, a spokesperson for the Solar Confederate Government today confirmed that the Colonial Assembly has voted overwhelmingly in favor of swift military action in response to the coup on Aetolus earlier this month. Icarus Front Chairperson Mackenzie West was quick to make a damning official statement: \"Dr. Harper and her radical agitators cannot be excused for their violent, despicable attempts to destabilize the flourishing economy of the Almach Rim. The ruthless murder of innocents, and illegal seizure of private property are crimes that cannot merely be met with strong words and gentle slaps to the wrist\"...\"I am proud to announce that two units of brave Solar marines have been assigned to the SCG-R Song Shi rapid response cruiser, with the full backing of the Icarus Front - and I hope with my heart, the backing of all patriotic Solar citizens.\"\
<br><br>\
The decision faced resistance from more laissez faire Assembly member states, including prominent SEO governor Bruno Ofako, delaying an earlier consensus. Supporters of the action hope that this decisive display of military strength will encourage the rebels to stand down without further bloodshed, and submit to prosecution by the Lunar High Courts.\
@@ -67,7 +69,7 @@
The Icarus Front has also proposed a temporary ban on continued Promethean research, though this motion has yet to gain any traction."
/datum/lore/codex/page/article5
name = "2/23/62-- \"Almach Association\" Shocks Nation"
name = "2/23/62 - \"Almach Association\" Shocks Nation"
data = "Shocking the nation, in the wee hours UTC a number of governments in the Almach Rim announced their intent to secede from the Confederacy as a unified political organization they refer to as the Almach Association, joining the already-declared Aetolian Council. Among the half-dozen affected systems is Angessa's Pearl, through which the Song Shi was passing en route to Aetolus. The Association has already issued a political manifesto and a foundational charter, leading political scientists across the galaxy to suspect back-doors collusion and possible Shelfican interference, a hypothesis made more likely by Morpheus Cyberkinetics' exonet site voicing support for the Association. Others suspect a moment of political crystallization, not unlike that in the Golden Hour three centuries ago. These researchers are already referring to this morning's events as the Gray Hour.\
<br><br>\
The Association's official manifesto repudiates the Five Points, calling them \"an archaic and distinctly human invention\". Experts agree that this bold declaration puts the Movement more in line with the Golden Hour than with the Age of Secession, and many fear that nothing short of a miracle like the discovery of the positronics will spare humanity from a bloody civil war.\
@@ -75,3 +77,20 @@
While the Association currently lists only a handful of Almach Rim systems as \"Constituent Organizations\", it has named Shelf, the Free Relan Federation, and the Eutopian Foreign Relations Board as \"observers\". The implications of this status are yet to be identified.\
<br><br>\
The fate of the SCG-R Song Shi and her crew remain unknown."
/datum/lore/codex/page/article6
name = "3/03/62 - A Week Out From Almach: What are the facts?"
data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG. <br><br>*This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong. <br><br>* Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter. <br><br>* None of these organizations have issued a statement on the matter.<br><br>* The SCG-R Song Shi was stranded in the region during the secession.<br><br>* SolGov has not issued an official statement of the fate of the Song Shi.<br><br>* Several confederate agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".<br><br>* SolGov itself has NOT declared a state of emergency.<br><br>* Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.<br><br>* Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.<br><br>* Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new Prometheans for the duration of the crisis.<br><br>* Local laws on the subject will apply until the Assembly meets late in May. <br><br>* No confederate lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.<br><br>* The border remains tightly closed to migrants, media, and diplomats alike."
/datum/lore/codex/page/article7
name = "3/21/62 - Relan, Shelf Join the Almach Association"
data = "Recent reports from within the Association indicate that the Free Relan Federation and Shelf have officially decided to join the Almach Association. President Nia Fischer of the FRF had this to say on the matter, in a speech addressed to the population at large. \
<br><br>\
\
\"Our decision to join the Association may, at first, seem strange. It is true that we have much to gain from trade with the Solars, and that the radical transhumanism of Angessa's Pearl is not our way. But I will remind you that it was Shelf, not Sol, who ensured our prosperity just over two decades ago-- who safeguarded our independence and prevented us from falling to barbarism and dictatorship. We owe it, not just to Shelf but to all the members of the Almach Rim, to support their independence just the same. And that, my fellow Relanians, is the crux of it all. The Association is a revolution, at the heart of it all, and many of the now-independent states were owned near-outright by Trans-Stellar Corporations until the Association allowed them to shake out their fetters. What right do we have to sit by while just a dozen light-years coreward newly-born republics suffer the growing pains of independence? What right do we have to bask in our own stability when our neighbors, our comrades in ideology, are struggling with a cruel blockade proposed by politicians back on Earth and Luna? That is why we must join with them, guard them, and guide them, for as long as need be.\"\
<br><br>\
\
A Shelfican spokesperson, meanwhile, had only this to say:\
<br><br>\
\"We're probably going to regret this but, y'know, the whole thing is kind of our fault. Sure, whatever.\""
+20 -10
View File
@@ -243,7 +243,7 @@ var/list/mining_overlay_cache = list()
/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(!density)
@@ -263,19 +263,19 @@ var/list/mining_overlay_cache = list()
if(valid_tool)
if (sand_dug)
user << "<span class='warning'>This area has already been dug.</span>"
to_chat(user, "<span class='warning'>This area has already been dug.</span>")
return
var/turf/T = user.loc
if (!(istype(T)))
return
user << "<span class='notice'>You start digging.</span>"
to_chat(user, "<span class='notice'>You start digging.</span>")
playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1)
if(!do_after(user,40)) return
user << "<span class='notice'>You dug a hole.</span>"
to_chat(user, "<span class='notice'>You dug a hole.</span>")
GetDrilled()
else if(istype(W,/obj/item/weapon/storage/bag/ore))
@@ -298,7 +298,7 @@ var/list/mining_overlay_cache = list()
return
var/obj/item/stack/rods/R = W
if (R.use(1))
user << "<span class='notice'>Constructing support lattice ...</span>"
to_chat(user, "<span class='notice'>Constructing support lattice ...</span>")
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
new /obj/structure/lattice(get_turf(src))
@@ -314,7 +314,7 @@ var/list/mining_overlay_cache = list()
S.use(1)
return
else
user << "<span class='warning'>The plating is going to need some support.</span>"
to_chat(user, "<span class='warning'>The plating is going to need some support.</span>")
return
@@ -334,7 +334,17 @@ var/list/mining_overlay_cache = list()
var/obj/item/device/measuring_tape/P = W
user.visible_message("<span class='notice'>\The [user] extends \a [P] towards \the [src].</span>","<span class='notice'>You extend \the [P] towards \the [src].</span>")
if(do_after(user, 15))
user << "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>"
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>")
return
if(istype(W, /obj/item/device/xenoarch_multi_tool))
var/obj/item/device/xenoarch_multi_tool/C = W
if(C.mode) //Mode means scanning
C.depth_scanner.scan_atom(user, src)
else
user.visible_message("<span class='notice'>\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!</span>", "<span class='notice'>You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!</span>")
if(do_after(user, 15))
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>")
return
if (istype(W, /obj/item/weapon/pickaxe))
@@ -356,7 +366,7 @@ var/list/mining_overlay_cache = list()
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
fail_message = ". <b>[pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]</b>"
user << "<span class='notice'>You start [P.drill_verb][fail_message].</span>"
to_chat(user, "<span class='notice'>You start [P.drill_verb][fail_message].</span>")
if(fail_message && prob(90))
if(prob(25))
@@ -375,7 +385,7 @@ var/list/mining_overlay_cache = list()
else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80%
excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F)
user << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
to_chat(user, "<span class='notice'>You finish [P.drill_verb] \the [src].</span>")
if(newDepth >= 200) // This means the rock is mined out fully
var/obj/structure/boulder/B
@@ -480,7 +490,7 @@ var/list/mining_overlay_cache = list()
if(prob(50))
pain = 1
for(var/mob/living/M in range(src, 200))
M << "<span class='danger'>[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!</span>"
to_chat(M, "<span class='danger'>[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!</span>")
if(pain)
flick("pain",M.pain)
if(prob(50))
+51 -8
View File
@@ -140,6 +140,42 @@ note dizziness decrements automatically in the mob's Life() proc.
//reset the pixel offsets to zero
is_floating = 0
/atom/movable/proc/fade_towards(atom/A,var/time = 2)
set waitfor = FALSE
var/pixel_x_diff = 0
var/pixel_y_diff = 0
var/pixel_z_diff = 0
var/direction = get_dir(src, A)
if(direction & NORTH)
pixel_y_diff = 32
else if(direction & SOUTH)
pixel_y_diff = -32
if(direction & EAST)
pixel_x_diff = 32
else if(direction & WEST)
pixel_x_diff = -32
if(!direction) // On top of?
pixel_z_diff = -8
var/default_pixel_x = initial(pixel_x)
var/default_pixel_y = initial(pixel_y)
var/default_pixel_z = initial(pixel_z)
var/initial_alpha = alpha
var/mob/mob = src
if(istype(mob))
default_pixel_x = mob.default_pixel_x
default_pixel_y = mob.default_pixel_y
animate(src, alpha = 0, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, pixel_z = pixel_z + pixel_z_diff, time = time)
sleep(time+1) //So you can wait on this proc to finish if you want to time your next steps
pixel_x = default_pixel_x
pixel_y = default_pixel_y
pixel_z = default_pixel_z
alpha = initial_alpha
/atom/movable/proc/do_attack_animation(atom/A)
var/pixel_x_diff = 0
@@ -167,7 +203,17 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/living/do_attack_animation(atom/A)
..()
is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
//Check for clients with pref enabled
var/list/viewing = list()
for(var/m in viewers(A))
var/mob/M = m
var/client/C = M.client
if(C && C.is_preference_enabled(/datum/client_preference/attack_icons))
viewing += M.client
//Animals attacking each other in the distance, probably. Forgeddaboutit.
if(!viewing.len)
return FALSE
// What icon do we use for the attack?
var/obj/used_item
@@ -180,6 +226,9 @@ note dizziness decrements automatically in the mob's Life() proc.
if(!used_item && !(attack_icon && attack_icon_state))
return FALSE //Didn't find an item, not doing animation.
// If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
is_floating = 0
var/image/I
if(used_item) //Found an in-hand item to animate
@@ -192,13 +241,7 @@ note dizziness decrements automatically in the mob's Life() proc.
I = image(attack_icon, A, attack_icon_state, A.layer + 1)
I.dir = dir
//Check for clients with pref enabled
var/list/viewing = list()
for(var/m in viewers(A))
var/mob/M = m
var/client/C = M.client
if(C && C.is_preference_enabled(/datum/client_preference/attack_icons))
viewing += M.client
// Show the overlay to the clients
flick_overlay(I, viewing, 5, TRUE) // 5 ticks/half a second
// Set the direction of the icon animation.
+8 -5
View File
@@ -8,7 +8,7 @@
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'icons/mob/ghost.dmi'
icon_state = "ghost"
layer = 3.9 //Just below normal mobs
layer = BELOW_MOB_LAYER
plane = PLANE_GHOSTS
alpha = 127
stat = DEAD
@@ -103,12 +103,12 @@
if (ishuman(body))
var/mob/living/carbon/human/H = body
icon = H.icon
underlays = H.underlays
overlays = H.overlays
icon_state = H.icon_state
add_overlay(H.overlays_standing) //All our equipment sprites
else
icon = body.icon
icon_state = body.icon_state
overlays = body.overlays
add_overlay(body.overlays)
gender = body.gender
if(body.mind && body.mind.name)
@@ -800,4 +800,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
if(PP.pai == null)
PP.overlays += "pai-ghostalert"
spawn(54)
PP.overlays.Cut()
PP.overlays.Cut()
/mob/observer/dead/speech_bubble_appearance()
return "ghost"
+2
View File
@@ -100,6 +100,7 @@
for(var/turf in visRemoved)
var/turf/t = turf
if(obscuredTurfs[t])
LAZYINITLIST(t.obfuscations)
if(!t.obfuscations[obfuscation.type])
var/image/ob_image = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER)
ob_image.plane = PLANE_FULLSCREEN
@@ -141,6 +142,7 @@
for(var/turf in obscuredTurfs)
var/turf/t = turf
LAZYINITLIST(t.obfuscations)
if(!t.obfuscations[obfuscation.type])
var/image/ob_image = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER)
ob_image.plane = PLANE_FULLSCREEN
+1 -1
View File
@@ -8,7 +8,7 @@
VN.updateVisibility(A, opacity_check)
/turf
var/list/image/obfuscations = new()
var/list/image/obfuscations
/turf/drain_power()
return -1
-5
View File
@@ -302,11 +302,6 @@
else adverb = " a very lengthy message"
message = "<B>[speaker]</B> [verb][adverb]."
if(src.status_flags & PASSEMOTES)
for(var/obj/item/weapon/holder/H in src.contents)
H.show_message(message)
for(var/mob/living/M in src.contents)
M.show_message(message)
src.show_message(message)
/mob/proc/hear_sleep(var/message)
+5 -3
View File
@@ -39,10 +39,13 @@ var/list/holder_mob_icon_cache = list()
update_state()
/obj/item/weapon/holder/proc/update_state()
if(istype(loc,/turf) || !(contents.len))
if(!(contents.len))
qdel(src)
else if(isturf(loc))
drop_items()
if(held_mob)
held_mob.forceMove(loc)
drop_items()
held_mob = null
qdel(src)
/obj/item/weapon/holder/proc/drop_items()
@@ -136,7 +139,6 @@ var/list/holder_mob_icon_cache = list()
grabber << "<span class='notice'>You scoop up \the [src]!</span>"
src << "<span class='notice'>\The [grabber] scoops you up!</span>"
grabber.status_flags |= PASSEMOTES
H.sync(src)
return H
+3 -2
View File
@@ -20,7 +20,7 @@
get_targets()
/mob/living/bot/cleanbot/handleIdle()
if(!screwloose && !oddbutton && prob(5))
if(!screwloose && !oddbutton && prob(2))
custom_emote(2, "makes an excited booping sound!")
playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
@@ -67,7 +67,8 @@
return
busy = 1
custom_emote(2, "begins to clean up \the [D]")
if(prob(20))
custom_emote(2, "begins to clean up \the [D]")
update_icons()
var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50
if(do_after(src, cleantime))
+1 -1
View File
@@ -338,7 +338,7 @@
new /obj/item/weapon/farmbot_arm_assembly(loc, src)
/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/organ/external/S, mob/user as mob)
if ((!istype(S, /obj/item/organ/external/arm)) || (!S.robotic == ORGAN_ROBOT))
if ((!istype(S, /obj/item/organ/external/arm)) || S.robotic != ORGAN_ROBOT)
..()
return
+1 -1
View File
@@ -333,7 +333,7 @@
qdel(src)
/obj/item/weapon/storage/firstaid/attackby(var/obj/item/organ/external/S, mob/user as mob)
if (!istype(S, /obj/item/organ/external/arm) || !(S.robotic == ORGAN_ROBOT))
if (!istype(S, /obj/item/organ/external/arm) || S.robotic != ORGAN_ROBOT)
..()
return
@@ -33,7 +33,6 @@
if(!istype(H) || !src || !(src.Adjacent(H)))
return 0
H << "You feel your being twine with that of \the [src] as it merges with your biomass."
H.status_flags |= PASSEMOTES
src << "You feel your being twine with that of \the [H] as you merge with its biomass."
loc = H
verbs += /mob/living/carbon/alien/diona/proc/split
@@ -66,4 +65,3 @@
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
M.status_flags &= ~PASSEMOTES
@@ -644,6 +644,10 @@
if(M)
message = "<span class='danger'>slaps [M] across the face. Ouch!</span>"
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
if(ishuman(M)) //Snowflakey!
var/mob/living/carbon/human/H = M
if(istype(H.wear_mask,/obj/item/clothing/mask/smokable))
H.drop_from_inventory(H.wear_mask)
else
message = "<span class='danger'>slaps [T.himself]!</span>"
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
+60 -4
View File
@@ -94,6 +94,8 @@
stat("Chemical Storage", mind.changeling.chem_charges)
stat("Genetic Damage Time", mind.changeling.geneticdamage)
stat("Re-Adaptations", "[mind.changeling.readapts]/[mind.changeling.max_readapts]")
if(species)
species.Stat(src)
/mob/living/carbon/human/ex_act(severity)
if(!blinded)
@@ -1270,9 +1272,12 @@
if(!affecting)
. = 0
fail_msg = "They are missing that limb."
else if (affecting.robotic >= ORGAN_ROBOT)
else if (affecting.robotic == ORGAN_ROBOT)
. = 0
fail_msg = "That limb is robotic."
else if (affecting.robotic >= ORGAN_LIFELIKE)
. = 0
fail_msg = "Your needle refuses to penetrate more than a short distance..."
else
switch(target_zone)
if(BP_HEAD)
@@ -1548,7 +1553,7 @@
return species.fire_icon_state
// Called by job_controller. Makes drones start with a permit, might be useful for other people later too.
/mob/living/carbon/human/equip_post_job() //Drone Permit moved to equip_survival_gear()
/mob/living/carbon/human/equip_post_job()
var/braintype = get_FBP_type()
if(braintype == FBP_DRONE)
var/turf/T = get_turf(src)
@@ -1558,7 +1563,58 @@
/mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot.
if(status_flags & HIDING) // Hiding? Carry on.
if(stat == DEAD || paralysis || weakened || stunned) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
status_flags &= ~HIDING //No hiding for you. Mob layer should be updated naturally, but it actually isn't.
if(stat == DEAD || paralysis || weakened || stunned || restrained()) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
reset_plane_and_layer()
status_flags &= ~HIDING
else
layer = HIDING_LAYER
/mob/living/carbon/human/proc/get_display_species()
//Shows species in tooltip
//Beepboops get special text if obviously beepboop
if(looksSynthetic())
if(gender == MALE)
return "Android"
else if(gender == FEMALE)
return "Gynoid"
else
return "Synthetic"
//Else species name
if(species)
return species.get_examine_name()
//Else CRITICAL FAILURE!
return ""
/mob/living/carbon/human/get_nametag_name(mob/user)
return name //Could do fancy stuff here?
/mob/living/carbon/human/get_nametag_desc(mob/user)
var/msg = ""
if(hasHUD(user,"security"))
//Try to find their name
var/perpname
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
else
perpname = name
//Try to find their record
var/criminal = "None"
if(perpname)
var/datum/data/record/G = find_general_record("name", perpname)
if(G)
var/datum/data/record/S = find_security_record("id", G.fields["id"])
if(S)
criminal = S.fields["criminal"]
//If it's interesting, append
if(criminal != "None")
msg += "([criminal]) "
if(hasHUD(user,"medical"))
msg += "(Health: [round((health/getMaxHealth())*100)]%) "
msg += get_display_species()
return msg
@@ -108,7 +108,8 @@
amount += O.burn_dam
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
/mob/living/carbon/human/adjustBruteLoss(var/amount,var/include_robo)
amount = amount*species.brute_mod
if(amount > 0)
for(var/datum/modifier/M in modifiers)
@@ -121,10 +122,11 @@
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
amount *= M.incoming_healing_percent
heal_overall_damage(-amount, 0)
heal_overall_damage(-amount, 0, include_robo)
BITSET(hud_updateflag, HEALTH_HUD)
/mob/living/carbon/human/adjustFireLoss(var/amount)
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
/mob/living/carbon/human/adjustFireLoss(var/amount,var/include_robo)
amount = amount*species.burn_mod
if(amount > 0)
for(var/datum/modifier/M in modifiers)
@@ -137,7 +139,7 @@
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
amount *= M.incoming_healing_percent
heal_overall_damage(0, -amount)
heal_overall_damage(0, -amount, include_robo)
BITSET(hud_updateflag, HEALTH_HUD)
/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
@@ -348,7 +350,8 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
//Heal MANY external organs, in random order
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn, var/include_robo)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
@@ -358,7 +361,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.heal_damage(brute,burn)
update |= picked.heal_damage(brute,burn,robo_repair = include_robo)
brute -= (brute_was-picked.brute_dam)
burn -= (burn_was-picked.burn_dam)
@@ -341,7 +341,7 @@ emp_act
/mob/living/carbon/human/emag_act(var/remaining_charges, mob/user, var/emag_source)
var/obj/item/organ/external/affecting = get_organ(user.zone_sel.selecting)
if(!affecting || !(affecting.status & ORGAN_ROBOT))
if(!affecting || !(affecting.robotic >= ORGAN_ROBOT))
user << "<span class='warning'>That limb isn't robotic.</span>"
return -1
if(affecting.sabotaged)
@@ -167,7 +167,7 @@
var/toxDam = getToxLoss()
if(toxDam)
output += "System Instability: <span class='warning'>[toxDam > 25 ? "Severe" : "Moderate"]</span>\n"
output += "System Instability: <span class='warning'>[toxDam > 25 ? "Severe" : "Moderate"]</span>. Seek charging station for cleanup.\n"
else
output += "System Instability: <span style='color:green;'>OK</span>\n"
@@ -273,26 +273,9 @@
var/obj/item/organ/O = new limb_path(src)
organ_data["descriptor"] = O.name
to_chat(src, "<span class='notice'>You feel a slithering sensation as your [O.name] reform.</span>")
update_icons_all()
update_icons_body()
active_regen = FALSE
else
to_chat(src, "<span class='critical'>Your regeneration is interrupted!</span>")
nutrition -= 75
active_regen = FALSE
/mob/living/carbon/human/proc/hide_humanoid()
set name = "Hide"
set desc = "Allows you to hide beneath tables or certain items. Toggled on or off."
set category = "Abilities"
if(stat == DEAD || paralysis || weakened || stunned || restrained()) // No hiding if you're stunned!
return
if(status_flags & HIDING)
layer = MOB_LAYER
to_chat(src, "<font color='blue'>You have stopped hiding.</font>")
else
layer = HIDING_LAYER //Just above cables with their 2.44
to_chat(src, "<font color='blue'>You are now hiding.</font>")
status_flags ^= HIDING
+5 -35
View File
@@ -850,28 +850,6 @@
if(status_flags & GODMODE)
return 0 //godmode
var/obj/item/organ/internal/diona/node/light_organ = locate() in internal_organs
if(!isSynthetic())
if(light_organ && !light_organ.is_broken())
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
light_amount = T.get_lumcount() * 10
nutrition += light_amount
traumatic_shock -= light_amount
if(species.flags & IS_PLANT)
if(nutrition > 450)
nutrition = 450
if(light_amount >= 3) //if there's enough light, heal
adjustBruteLoss(-(round(light_amount/2)))
adjustFireLoss(-(round(light_amount/2)))
adjustToxLoss(-(light_amount))
adjustOxyLoss(-(light_amount))
//TODO: heal wounds, heal broken limbs.
if(species.light_dam)
var/light_amount = 0
if(isturf(loc))
@@ -899,14 +877,6 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken()))
if(nutrition < 200)
take_overall_damage(2,0)
//traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter.
//Not that it matters much for diona, who have NO_PAIN.
shock_stage++
// TODO: stomach and bloodstream organ.
if(!isSynthetic())
handle_trace_chems()
@@ -1161,7 +1131,7 @@
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : SEE_INVISIBLE_LIVING
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : see_invisible_default
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
@@ -1173,7 +1143,7 @@
if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
see_invisible = SEE_INVISIBLE_CULT
else
see_invisible = SEE_INVISIBLE_LIVING
see_invisible = see_invisible_default
seer = 0
if(!seedarkness)
@@ -1184,7 +1154,7 @@
else
sight = species.get_vision_flags(src)
see_in_dark = species.darksight
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : SEE_INVISIBLE_LIVING
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : see_invisible_default
var/tmp/glasses_processed = 0
var/obj/item/weapon/rig/rig = back
@@ -1205,7 +1175,7 @@
if(!glasses_processed && (species.get_vision_flags(src) > 0))
sight |= species.get_vision_flags(src)
if(!seer && !glasses_processed && seedarkness)
see_invisible = SEE_INVISIBLE_LIVING
see_invisible = see_invisible_default
if(healths)
if (chem_effects[CE_PAINKILLER] > 100)
@@ -1385,7 +1355,7 @@
if(G.see_invisible >= 0)
see_invisible = G.see_invisible
else if(!druggy && !seer)
see_invisible = SEE_INVISIBLE_LIVING
see_invisible = see_invisible_default
/mob/living/carbon/human/handle_random_events()
if(inStasisNow())
@@ -422,3 +422,7 @@
// Used to override normal fall behaviour. Use only when the species does fall down a level.
/datum/species/proc/fall_impact_special(var/mob/living/carbon/human/H, var/atom/A)
return FALSE
// Allow species to display interesting information in the human stat panels
/datum/species/proc/Stat(var/mob/living/carbon/human/H)
return
@@ -183,6 +183,9 @@ var/list/wrapped_species_by_ref = list()
r_skin = hex2num(copytext(new_skin, 2, 4))
g_skin = hex2num(copytext(new_skin, 4, 6))
b_skin = hex2num(copytext(new_skin, 6, 8))
r_synth = r_skin
g_synth = g_skin
b_synth = b_skin
var/datum/species/shapeshifter/S = species
if(S.monochromatic)
@@ -286,4 +289,36 @@ var/list/wrapped_species_by_ref = list()
if(species && mind)
apply_traits()
return
return
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour()
set name = "Select Eye Color"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 50
var/current_color = rgb(r_eyes,g_eyes,b_eyes)
var/new_eyes = input("Pick a new color for your eyes.","Eye Color", current_color) as null|color
if(!new_eyes)
return
shapeshifter_set_eye_color(new_eyes)
/mob/living/carbon/human/proc/shapeshifter_set_eye_color(var/new_eyes)
var/list/new_color_rgb_list = hex2rgb(new_eyes)
// First, update mob vars.
r_eyes = new_color_rgb_list[1]
g_eyes = new_color_rgb_list[2]
b_eyes = new_color_rgb_list[3]
// Now sync the organ's eye_colour list, if possible
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
if(istype(eyes))
eyes.update_colour()
update_icons_body()
update_eyes()
@@ -83,6 +83,7 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
/mob/living/carbon/human/proc/regenerate
@@ -114,7 +114,7 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/hide_humanoid
/mob/living/proc/hide
)
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
@@ -405,3 +405,33 @@
qdel(D)
H.visible_message("<span class='danger'>\The [H] splits apart with a wet slithering noise!</span>")
/datum/species/diona/handle_environment_special(var/mob/living/carbon/human/H)
if(H.inStasisNow())
return
var/obj/item/organ/internal/diona/node/light_organ = locate() in H.internal_organs
if(light_organ && !light_organ.is_broken())
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = T.get_lumcount() * 10
H.nutrition += light_amount
H.shock_stage -= light_amount
if(H.nutrition > 450)
H.nutrition = 450
if(light_amount >= 3) //if there's enough light, heal
H.adjustBruteLoss(-(round(light_amount/2)))
H.adjustFireLoss(-(round(light_amount/2)))
H.adjustToxLoss(-(light_amount))
H.adjustOxyLoss(-(light_amount))
//TODO: heal wounds, heal broken limbs.
else if(H.nutrition < 200)
H.take_overall_damage(2,0)
//traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter.
//Not that it matters much for diona, who have NO_PAIN.
H.shock_stage++
@@ -231,7 +231,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(eyes)
icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
else
icon_key += "#000000"
icon_key += "[r_eyes], [g_eyes], [b_eyes]"
for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = organs_by_name[organ_tag]
@@ -100,7 +100,7 @@
src.lying = 1
src.blinded = 1
else
if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
if (src.paralysis || src.stunned || src.weakened || (status_flags & FAKEDEATH)) //Stunned etc.
if (src.stunned > 0)
src.stat = 0
if (src.weakened > 0)
@@ -6,7 +6,8 @@
var/is_adult = 0
speak_emote = list("chirps")
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
maxHealth = 150
health = 150
gender = NEUTER
+4 -4
View File
@@ -13,7 +13,6 @@
var/mutable_appearance/dsma = new(dsoverlay) //Changing like ten things, might as well.
dsma.alpha = 0
dsma.plane = PLANE_LIGHTING
dsma.layer = LIGHTING_LAYER + 0.1
dsma.blend_mode = BLEND_ADD
dsoverlay.appearance = dsma
@@ -254,7 +253,8 @@ default behaviour is:
/mob/living/proc/getActualBruteLoss() // Mostly for humans with robolimbs.
return getBruteLoss()
/mob/living/proc/adjustBruteLoss(var/amount)
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
/mob/living/proc/adjustBruteLoss(var/amount,var/include_robo)
if(status_flags & GODMODE) return 0 //godmode
if(amount > 0)
@@ -328,7 +328,8 @@ default behaviour is:
/mob/living/proc/getActualFireLoss() // Mostly for humans with robolimbs.
return getFireLoss()
/mob/living/proc/adjustFireLoss(var/amount)
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
/mob/living/proc/adjustFireLoss(var/amount,var/include_robo)
if(status_flags & GODMODE) return 0 //godmode
if(amount > 0)
for(var/datum/modifier/M in modifiers)
@@ -834,7 +835,6 @@ default behaviour is:
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
M.status_flags &= ~PASSEMOTES
else if(istype(H.loc,/obj/item/clothing/accessory/holster))
var/obj/item/clothing/accessory/holster/holster = H.loc
@@ -55,5 +55,7 @@
var/glow_intensity = null
var/glow_color = "#FFFFFF" // The color they're glowing!
var/see_invisible_default = SEE_INVISIBLE_LIVING
var/list/hud_list //Holder for health hud, status hud, wanted hud, etc (not like inventory slots)
var/has_huds = FALSE //Whether or not we should bother initializing the above list
+7 -4
View File
@@ -6,9 +6,12 @@
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
if(layer == HIDING_LAYER)
layer = MOB_LAYER
src << text("<font color='blue'>You have stopped hiding.</font>")
if(status_flags & HIDING)
status_flags &= ~HIDING
reset_plane_and_layer()
to_chat(src,"<span class='notice'>You have stopped hiding.</span>")
else
status_flags |= HIDING
layer = HIDING_LAYER //Just above cables with their 2.44
src << text("<font color='blue'>You are now hiding.</font>")
plane = OBJ_PLANE
to_chat(src,"<span class='notice'>You are now hiding.</span>")
+29 -7
View File
@@ -298,11 +298,14 @@ proc/get_radio_key_from_channel(var/channel)
else
return 1 //If we're in nullspace, then forget it.
//Remember the speech images so we can remove them later and they can get GC'd
var/list/images_to_clients = list()
//The 'post-say' static speech bubble
var/speech_bubble_test = say_test(message)
var/speech_type = speech_bubble_appearance()
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"[speech_type][speech_bubble_test]")
spawn(30) qdel(speech_bubble)
images_to_clients[speech_bubble] = list()
// Attempt Multi-Z Talking
var/mob/above = src.shadow
@@ -311,7 +314,7 @@ proc/get_radio_key_from_channel(var/channel)
if(ST)
var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view)
var/image/z_speech_bubble = image('icons/mob/talk.dmi', above, "h[speech_bubble_test]")
spawn(30) qdel(z_speech_bubble)
images_to_clients[z_speech_bubble] = list()
for(var/item in results["mobs"])
if(item != above && !(item in listening))
listening[item] = z_speech_bubble
@@ -326,12 +329,17 @@ proc/get_radio_key_from_channel(var/channel)
var/dst = get_dist(get_turf(M),get_turf(src))
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
M << (listening[M] || speech_bubble) // Send the image attached to shadow mob if available
if(M.client)
var/image/I1 = listening[M] || speech_bubble
images_to_clients[I1] |= M.client
M << I1
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
if(whispering) //Don't even bother with these unless whispering
if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range
M << (listening[M] || speech_bubble) // Send the image attached to shadow mob if available
if(M.client)
var/image/I2 = listening[M] || speech_bubble
images_to_clients[I2] |= M.client
M << I2
M.hear_say(stars(message), verb, speaking, alt_name, italics, src, speech_sound, sound_vol*0.2)
if(dst > w_scramble_range && dst <= world.view) //Inside whisper 'visible' range
M.show_message("<span class='game say'><span class='name'>[src.name]</span> [w_not_heard].</span>", 2)
@@ -344,6 +352,17 @@ proc/get_radio_key_from_channel(var/channel)
if(dst <= message_range)
O.hear_talk(src, message, verb, speaking)
//Remove all those images. At least it's just ONE spawn this time.
spawn(30)
for(var/img in images_to_clients)
var/image/I = img
var/list/clients_from_image = images_to_clients[I]
for(var/client in clients_from_image)
var/client/C = client
if(C) //Could have disconnected after message sent, before removing bubble.
C.images -= I
qdel(I)
//Log the message to file
if(whispering)
log_whisper(message,src)
@@ -352,8 +371,11 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
for (var/mob/O in viewers(src, null))
O.hear_signlang(message, verb, language, src)
var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view)
var/list/mobs = potentials["mobs"]
for(var/hearer in mobs)
var/mob/M = hearer
M.hear_signlang(message, verb, language, src)
return 1
/obj/effect/speech_bubble
+1 -1
View File
@@ -258,7 +258,7 @@ var/list/ai_verbs_default = list(
aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
if(aiCommunicator)
aiCommunicator.register_device(src)
aiCommunicator.register_device(src.name)
/*
The AI Power supply is a dummy object used for powering the AI since only machinery should be using power.
+7 -12
View File
@@ -210,7 +210,7 @@
/mob/living/silicon/robot/proc/setup_communicator()
if (!communicator)
communicator = new/obj/item/device/communicator/integrated(src)
communicator.register_device(src, "[modtype] [braintype]")
communicator.register_device(src.name, "[modtype] [braintype]")
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
@@ -706,34 +706,29 @@
return 0
/mob/living/silicon/robot/updateicon()
overlays.Cut()
cut_overlays()
if(stat == CONSCIOUS)
overlays += "eyes-[module_sprites[icontype]]"
add_overlay("eyes-[module_sprites[icontype]]")
if(opened)
var/panelprefix = custom_sprite ? "[src.ckey]-[src.name]" : "ov"
if(wiresexposed)
overlays += "[panelprefix]-openpanel +w"
add_overlay("[panelprefix]-openpanel +w")
else if(cell)
overlays += "[panelprefix]-openpanel +c"
add_overlay("[panelprefix]-openpanel +c")
else
overlays += "[panelprefix]-openpanel -c"
add_overlay("[panelprefix]-openpanel -c")
if(has_active_type(/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = locate() in src
if(shield && shield.active)
overlays += "[module_sprites[icontype]]-shield"
add_overlay("[module_sprites[icontype]]-shield")
if(modtype == "Combat")
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
icon_state = "[module_sprites[icontype]]-roll"
else
icon_state = module_sprites[icontype]
return
if(typing)
typing = FALSE
set_typing_indicator(1)
/mob/living/silicon/robot/proc/installed_modules()
if(weapon_lock)
+2 -1
View File
@@ -30,7 +30,8 @@
/mob/living/silicon/New()
silicon_mob_list |= src
..()
add_language("Galactic Common")
add_language(LANGUAGE_GALCOM)
set_default_language(all_languages[LANGUAGE_GALCOM])
init_id()
init_subsystems()
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/scarybat
name = "space bats"
desc = "A swarm of cute little blood sucking bats that looks pretty upset."
tt_desc = "Desmodus rotundus" //Common vampire bat
icon = 'icons/mob/bats.dmi'
icon_state = "bat"
icon_living = "bat"
@@ -2,6 +2,7 @@
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
tt_desc = "Ursinae aetherius" //...bearspace? Maybe.
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
tt_desc = "Cyprinus aetherius" //carpspace? maybe
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
@@ -2,6 +2,7 @@
/mob/living/simple_animal/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
tt_desc = "Felis catus"
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
@@ -3,6 +3,7 @@
name = "corgi"
real_name = "corgi"
desc = "It's a corgi."
tt_desc = "Canis familiaris"
intelligence_level = SA_ANIMAL
icon_state = "corgi"
icon_living = "corgi"
@@ -37,6 +38,7 @@
real_name = "Ian" //Intended to hold the name without altering it.
gender = MALE
desc = "It's a corgi."
tt_desc = "Canis commandus"
var/turns_since_scan = 0
var/obj/movement_target
response_help = "pets"
@@ -2,6 +2,7 @@
/mob/living/simple_animal/crab
name = "crab"
desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time."
tt_desc = "Ranina ranina"
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
@@ -2,6 +2,7 @@
/mob/living/simple_animal/retaliate/goat
name = "goat"
desc = "Not known for their pleasant disposition."
tt_desc = "Oreamnos americanus"
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
@@ -85,6 +86,7 @@
/mob/living/simple_animal/cow
name = "cow"
desc = "Known for their milk, just don't tip them over."
tt_desc = "Bos taurus"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_dead"
@@ -153,6 +155,7 @@
/mob/living/simple_animal/chick
name = "\improper chick"
desc = "Adorable! They make such a racket though."
tt_desc = "Gallus domesticus"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_dead"
@@ -203,6 +206,7 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
tt_desc = "Gallus domesticus"
icon_state = "chicken"
icon_living = "chicken"
icon_dead = "chicken_dead"
@@ -8,6 +8,7 @@
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
tt_desc = "Atrax robustus gigantus"
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/goose
name = "space goose"
desc = "That's no duck. That's a space goose. You have a bad feeling about this."
tt_desc = "Anser aetherius" //Goose space?!
icon_state = "goose"
icon_living = "goose"
icon_dead = "goose_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/lizard
name = "Lizard"
desc = "A cute tiny lizard."
tt_desc = "Gekko gecko"
icon = 'icons/mob/critter.dmi'
icon_state = "lizard"
icon_living = "lizard"
@@ -2,6 +2,7 @@
name = "mouse"
real_name = "mouse"
desc = "It's a small rodent."
tt_desc = "Mus musculus"
icon_state = "mouse_gray"
item_state = "mouse_gray"
icon_living = "mouse_gray"
@@ -31,6 +31,7 @@
/mob/living/simple_animal/parrot
name = "parrot"
desc = "The parrot squawks, \"It's a parrot! BAWWK!\""
tt_desc = "Poicephalus robustus"
icon = 'icons/mob/animal.dmi'
icon_state = "parrot_fly"
icon_living = "parrot_fly"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/penguin
name = "space penguin"
desc = "An ungainly, waddling, cute, and VERY well-dressed bird."
tt_desc = "Aptenodytes forsteri"
icon_state = "penguin"
icon_living = "penguin"
icon_dead = "penguin_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/slime
name = "pet slime"
desc = "A lovable, domesticated slime."
tt_desc = "Amorphidae proteus"
icon = 'icons/mob/slimes.dmi'
icon_state = "grey baby slime"
icon_living = "grey baby slime"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/spiderbot
name = "spider-bot"
desc = "A skittering robotic friend!"
tt_desc = "Maintenance Robot"
icon = 'icons/mob/robots.dmi'
icon_state = "spiderbot-chassis"
icon_living = "spiderbot-chassis"
@@ -168,9 +168,6 @@
host.reset_view(null)
host.machine = null
var/mob/living/H = host
H.status_flags &= ~PASSEMOTES
host = null
return
@@ -104,7 +104,6 @@
M << "Something disgusting and slimy wiggles into your ear!"
src.host = M
src.host.status_flags |= PASSEMOTES
src.forceMove(M)
//Update their traitor status.
@@ -5,6 +5,7 @@
/mob/living/simple_animal
name = "animal"
desc = ""
icon = 'icons/mob/animal.dmi'
health = 20
maxHealth = 20
@@ -13,6 +14,8 @@
mob_swap_flags = MONKEY|SLIME|HUMAN
mob_push_flags = MONKEY|SLIME|HUMAN
var/tt_desc = "Uncataloged Life Form" //Tooltip description
//Settings for played mobs
var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
var/ai_inactive = 0 // Set to 1 to turn off most AI actions
@@ -1697,3 +1700,6 @@
/mob/living/simple_animal/retaliate
retaliate = 1
destroy_surroundings = 1
/mob/living/simple_animal/get_nametag_desc(mob/user)
return "<i>[tt_desc]</i>"
+2 -5
View File
@@ -8,11 +8,8 @@
emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so...
/mob/living/voice/New(loc)
add_language("Galactic Common")
for(var/datum/language/L in languages) //This is needed to get around some saycode problems.
if(L.name == "Galactic Common")
set_default_language(L)
break
add_language(LANGUAGE_GALCOM)
set_default_language(all_languages[LANGUAGE_GALCOM])
if(istype(loc, /obj/item/device/communicator))
comm = loc
+4
View File
@@ -57,3 +57,7 @@
//set macro to normal incase it was overriden (like cyborg currently does)
client.set_hotkeys_macro("macro", "hotkeymode")
if(!client.tooltips)
client.tooltips = new(client)
+16
View File
@@ -1143,3 +1143,19 @@ mob/proc/yank_out_object()
//Throwing stuff
/mob/proc/throw_item(atom/target)
return
/mob/MouseEntered(location, control, params)
if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips))
openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr))
..()
/mob/MouseDown()
closeToolTip(usr) //No reason not to, really
..()
/mob/MouseExited()
closeToolTip(usr) //No reason not to, really
..()
+3 -4
View File
@@ -1,6 +1,7 @@
/mob
density = 1
layer = 4.0
layer = MOB_LAYER
plane = MOB_PLANE
animate_movement = 2
flags = PROXMOVE
var/datum/mind/mind
@@ -219,9 +220,7 @@
var/get_rig_stats = 0 //Moved from computer.dm
var/hud_typing = 0 //Typing indicator stuff.
var/typing //Simple mobs use this variable.
var/typing
var/obj/effect/decal/typing_indicator
var/low_priority = FALSE //Skip processing life() if there's just no players on this Z-level
+3 -4
View File
@@ -31,7 +31,6 @@
var/force_down //determines if the affecting mob will be pinned to the ground
var/dancing //determines if assailant and affecting keep looking at each other. Basically a wrestling position
layer = 21
abstract = 1
item_state = "nothing"
w_class = ITEMSIZE_HUGE
@@ -194,7 +193,7 @@
return
var/shift = 0
var/adir = get_dir(assailant, affecting)
affecting.layer = 4
affecting.layer = MOB_LAYER
switch(state)
if(GRAB_PASSIVE)
shift = 8
@@ -217,7 +216,7 @@
switch(adir)
if(NORTH)
animate(affecting, pixel_x = 0, pixel_y =-shift, 5, 1, LINEAR_EASING)
affecting.layer = 3.9
affecting.layer = BELOW_MOB_LAYER
if(SOUTH)
animate(affecting, pixel_x = 0, pixel_y = shift, 5, 1, LINEAR_EASING)
if(WEST)
@@ -396,7 +395,7 @@
/obj/item/weapon/grab/Destroy()
animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING)
affecting.layer = 4
affecting.reset_plane_and_layer()
if(affecting)
affecting.grabbed_by -= src
affecting = null
-1
View File
@@ -135,7 +135,6 @@
//Lighting is weird and has matrix shenanigans. Think of this as turning on/off darkness.
/obj/screen/plane_master/fullbright
plane = PLANE_LIGHTING
layer = LIGHTING_LAYER+1
color = null //To break lighting when visible (this is sorta backwards)
alpha = 0 //Starts full opaque
invisibility = 101
+10 -11
View File
@@ -115,7 +115,13 @@
if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
var/mob/observer/dead/observer = new()
//Make a new mannequin quickly, and allow the observer to take the appearance
var/mob/living/carbon/human/dummy/mannequin = new()
client.prefs.dress_preview_mob(mannequin)
var/mob/observer/dead/observer = new(mannequin)
observer.forceMove(null) //Let's not stay in our doomed mannequin
qdel(mannequin)
spawning = 1
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
@@ -125,20 +131,13 @@
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
if(istype(O))
src << "<span class='notice'>Now teleporting.</span>"
observer.loc = O.loc
to_chat(src,"<span class='notice'>Now teleporting.</span>")
observer.forceMove(O.loc)
else
src << "<span class='danger'>Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.</span>"
to_chat(src,"<span class='danger'>Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.</span>")
observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly.
announce_ghost_joinleave(src)
var/mob/living/carbon/human/dummy/mannequin = new()
client.prefs.dress_preview_mob(mannequin)
observer.appearance = mannequin
observer.alpha = 127
observer.layer = initial(observer.layer)
observer.invisibility = initial(observer.invisibility)
qdel(mannequin)
if(client.prefs.be_random_name)
client.prefs.real_name = random_name(client.prefs.identifying_gender)
+2 -2
View File
@@ -11,7 +11,7 @@
set name = "Say"
set category = "IC"
set_typing_indicator(0)
set_typing_indicator(FALSE)
usr.say(message)
/mob/verb/me_verb(message as text)
@@ -24,7 +24,7 @@
message = sanitize(message)
set_typing_indicator(0)
set_typing_indicator(FALSE)
if(use_me)
usr.emote("me",usr.emote_type,message)
else
+20 -35
View File
@@ -1,41 +1,34 @@
/mob/proc/set_typing_indicator(var/state) //Leaving this here for mobs.
if(!is_preference_enabled(/datum/client_preference/show_typing_indicator))
cut_overlay(typing_indicator, TRUE)
return
if(!typing_indicator)
typing_indicator = new
typing_indicator.icon = 'icons/mob/talk.dmi'
typing_indicator.icon_state = "[speech_bubble_appearance()]_typing"
if(client && !stat)
typing_indicator.invisibility = invisibility
if(!is_preference_enabled(/datum/client_preference/show_typing_indicator))
add_overlay(typing_indicator)
else
if(state)
if(!typing)
add_overlay(typing_indicator)
typing = 1
else
if(typing)
cut_overlay(typing_indicator)
typing = 0
return state
if(state && !typing)
add_overlay(typing_indicator, TRUE)
typing = TRUE
else if(typing)
cut_overlay(typing_indicator, TRUE)
typing = FALSE
if(shadow) //Multi-Z above-me shadows
shadow.set_typing_indicator(state)
return state
/mob/verb/say_wrapper()
set name = ".Say"
set hidden = 1
if(!ishuman(src)) //If they're a mob, use the old code.
set_typing_indicator(1)
else if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
hud_typing = 1
set_typing_indicator(TRUE)
var/message = input("","say (text)") as text
if(!ishuman(src)) //If they're a mob, use the old code.
set_typing_indicator(0)
else if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
hud_typing = 0
set_typing_indicator(FALSE)
if(message)
say_verb(message)
@@ -43,17 +36,9 @@
set name = ".Me"
set hidden = 1
if(!ishuman(src)) //If they're a mob, use the old code.
set_typing_indicator(1)
else if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
hud_typing = 1
set_typing_indicator(TRUE)
var/message = input("","me (text)") as text
if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
hud_typing = 0
else if(!ishuman(src)) //If they're a mob, use the old code.
set_typing_indicator(0)
set_typing_indicator(FALSE)
if(message)
me_verb(message)
+10
View File
@@ -84,6 +84,16 @@
/mob/proc/can_ztravel()
return 0
/mob/living/zMove(direction)
//Sort of a lame hack to allow ztravel through zpipes. Should be improved.
if(is_ventcrawling && istype(loc,/obj/machinery/atmospherics/pipe/zpipe))
var/obj/machinery/atmospherics/pipe/zpipe/currentpipe = loc
if(istype(currentpipe.node1,/obj/machinery/atmospherics/pipe/zpipe))
currentpipe.ventcrawl_to(src, currentpipe.node1, direction)
else if(istype(currentpipe.node2,/obj/machinery/atmospherics/pipe/zpipe))
currentpipe.ventcrawl_to(src, currentpipe.node2, direction)
return ..()
/mob/observer/can_ztravel()
return 1
+1 -7
View File
@@ -56,6 +56,7 @@
overlays = M.overlays
transform = M.transform
dir = M.dir
invisibility = M.invisibility
if(shadow)
shadow.sync_icon(src)
@@ -117,13 +118,6 @@
if(shadow)
shadow.visible_message(message, self_message, blind_message)
// We should show the typing indicator so people above us can tell we're about to talk.
/mob/set_typing_indicator(var/state)
var/old_typing = src.typing
. = ..()
if(shadow && old_typing != src.typing)
shadow.set_typing_indicator(state) // Okay the real proc changed something! That means we should handle things too
/mob/zshadow/set_typing_indicator(var/state)
if(!typing_indicator)
typing_indicator = new
+5
View File
@@ -519,3 +519,8 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/update(var/force_open = 0)
src_object.ui_interact(user, ui_key, src, force_open, master_ui, state)
/datum/nanoui/proc/append_template(var/key, var/filename)
add_template(key, filename)
open()
update(1)
@@ -52,13 +52,13 @@
. = ..() //Should be an interger value for infection level
if(!.) return
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO
if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO
if (prob(3))
take_damage(1,silent=prob(30))
if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE
if (prob(50))
take_damage(1,silent=prob(15))
+11 -11
View File
@@ -148,25 +148,25 @@ var/list/organ_cache = list()
germ_level = 0
return 0
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
var/infection_damage = 0
if((status & ORGAN_DEAD) && antibiotics < 30) //Sepsis from 'dead' organs
if((status & ORGAN_DEAD) && antibiotics < ANTIBIO_OD) //Sepsis from 'dead' organs
infection_damage = min(1, 1 + round((germ_level - INFECTION_LEVEL_THREE)/200,0.25)) //1 Tox plus a little based on germ level
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < 30)
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < ANTIBIO_OD)
infection_damage = min(0.25, 0.25 + round((germ_level - INFECTION_LEVEL_TWO)/200,0.25))
if(infection_damage)
owner.adjustToxLoss(infection_damage)
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
adjust_germ_level(-1)
adjust_germ_level(-antibiotics)
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
if(!antibiotics && prob(round(germ_level/6)))
adjust_germ_level(1)
if(germ_level >= INFECTION_LEVEL_ONE)
@@ -181,7 +181,7 @@ var/list/organ_cache = list()
. = 2 //Organ qualifies for effect-specific processing
//No particular effect on the general 'organ' at 3
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < ANTIBIO_OD)
. = 3 //Organ qualifies for effect-specific processing
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
@@ -234,19 +234,19 @@ var/list/organ_cache = list()
//Germs
/obj/item/organ/proc/handle_antibiotics()
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
if (!germ_level || antibiotics < 5)
if (!germ_level || antibiotics < ANTIBIO_NORM)
return
if (germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
else if (germ_level < INFECTION_LEVEL_TWO)
adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
adjust_germ_level(-antibiotics*4) //at germ_level < 500, this should cure the infection in a minute
else if (germ_level < INFECTION_LEVEL_THREE)
adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
adjust_germ_level(-antibiotics*2) //at germ_level < 1000, this will cure the infection in 5 minutes
else
adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
adjust_germ_level(-antibiotics) // You waited this long to get treated, you don't really deserve this organ
//Adds autopsy data for used_weapon.
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
+5 -5
View File
@@ -621,13 +621,13 @@ Note that amputating the affected organ does in fact remove the infection from t
handle_germ_effects()
/obj/item/organ/external/proc/handle_germ_sync()
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
for(var/datum/wound/W in wounds)
//Open wounds can become infected
if (owner.germ_level > W.germ_level && W.infection_check())
W.germ_level++
if (antibiotics < 5)
if (antibiotics < ANTIBIO_NORM)
for(var/datum/wound/W in wounds)
//Infected wounds raise the organ's germ level
if (W.germ_level > germ_level)
@@ -638,9 +638,9 @@ Note that amputating the affected organ does in fact remove the infection from t
. = ..() //May be null or an infection level, if null then no specific processing needed here
if(!.) return
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO
if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO
//spread the infection to internal organs
var/obj/item/organ/target_organ = null //make internal organs become infected one at a time instead of all at once
for (var/obj/item/organ/I in internal_organs)
@@ -672,7 +672,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
parent.germ_level++
if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE
if (!(status & ORGAN_DEAD))
status |= ORGAN_DEAD
owner << "<span class='notice'>You can't feel your [name] anymore...</span>"
+29 -13
View File
@@ -50,44 +50,60 @@ var/global/list/limb_icon_cache = list()
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/get_icon()
..()
overlays.Cut()
//The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item
cut_overlays()
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
if(owner.should_have_organ(O_EYES))
//Eye color/icon
var/should_have_eyes = owner.should_have_organ(O_EYES)
var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR
if((should_have_eyes || has_eye_color) && eye_icon)
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eye_icon)
var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon)
var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon)
//Should have eyes
if(should_have_eyes)
//And we have them
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
//They're gone!
else
eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
//We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species)
else
eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD)
add_overlay(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
//Lip color/icon
if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
add_overlay(lip_icon)
mob_icon.Blend(lip_icon, ICON_OVERLAY)
//Head markings.
//Head markings
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
overlays |= mark_s //So when it's not on your body, it has icons
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
//Facial hair
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
overlays |= facial_s
add_overlay(facial_s)
//Head hair
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
@@ -96,7 +112,7 @@ var/global/list/limb_icon_cache = list()
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
overlays |= hair_s
add_overlay(hair_s)
return mob_icon
+2 -1
View File
@@ -13,7 +13,8 @@
w_class = ITEMSIZE_TINY
throw_range = 1
throw_speed = 1
layer = 4
plane = MOB_PLANE
layer = MOB_LAYER
pressure_resistance = 1
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
+2 -1
View File
@@ -8,7 +8,8 @@
w_class = ITEMSIZE_SMALL
throw_range = 2
throw_speed = 1
layer = 4
plane = MOB_PLANE
layer = MOB_LAYER
pressure_resistance = 1
attack_verb = list("bapped")
var/page = 1 // current page
+14 -7
View File
@@ -184,11 +184,18 @@
var/instant = 0
var/colourName = "red" //for updateIcon purposes
suicide_act(mob/user)
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
viewers(user) << "<font color='red'><b>[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide.</b></font>"
return (BRUTELOSS|OXYLOSS)
/obj/item/weapon/pen/crayon/suicide_act(mob/user)
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
viewers(user) << "<font color='red'><b>[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide.</b></font>"
return (BRUTELOSS|OXYLOSS)
New()
name = "[colourName] crayon"
..()
/obj/item/weapon/pen/crayon/New()
name = "[colourName] crayon"
/obj/item/weapon/pen/crayon/marker
name = "marker"
desc = "A chisel-tip permanent marker. Hopefully non-toxic."
icon_state = "markerred"
/obj/item/weapon/pen/crayon/marker/New()
name = "[colourName] marker"
+2 -1
View File
@@ -9,7 +9,8 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "emfield_s1"
alpha = 50
layer = 4
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
light_color = "#cc7700"
var/size = 1
@@ -2,7 +2,6 @@
name = "fuel rod assembly"
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "fuel_assembly"
layer = 4
var/material_name
@@ -4,7 +4,6 @@
icon_state = "fuel_compressor1"
density = 1
anchored = 1
layer = 4
circuit = /obj/item/weapon/circuitboard/fusion_fuel_compressor
+6 -4
View File
@@ -16,7 +16,8 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
layer = 5
plane = MOB_LAYER
layer = ABOVE_MOB_LAYER
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -132,7 +133,8 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "bulb-construct-stage1"
anchored = 1
layer = 5
plane = MOB_LAYER
layer = ABOVE_MOB_LAYER
stage = 1
fixture_type = "bulb"
sheets_refunded = 1
@@ -143,7 +145,6 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flamp-construct-stage1"
anchored = 0
layer = OBJ_LAYER
stage = 1
fixture_type = "flamp"
sheets_refunded = 2
@@ -156,7 +157,8 @@
icon_state = "tube1"
desc = "A lighting fixture."
anchored = 1
layer = 5 // They were appearing under mobs which is a little weird - Ostaf
plane = MOB_LAYER
layer = ABOVE_MOB_LAYER
use_power = 2
idle_power_usage = 2
active_power_usage = 20
@@ -12,7 +12,7 @@
desc = "Small machine which transmits data about specific powernet"
anchored = 1
density = 0
layer = 2.46 // Above cables, but should be below floors.
layer = ABOVE_UTILITY
icon = 'icons/obj/objects.dmi'
icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me.
@@ -7,7 +7,7 @@
icon_state = "singularity_s1"
anchored = 1
density = 1
layer = 6
plane = ABOVE_PLANE
light_range = 6
unacidable = 1 //Don't comment this out.
+2 -2
View File
@@ -8,10 +8,10 @@
icon_state = "term"
desc = "It's an underfloor wiring terminal for power equipment."
level = 1
layer = TURF_LAYER
var/obj/machinery/power/master = null
anchored = 1
layer = 2.6 // a bit above wires
plane = PLATING_PLANE
layer = WIRES_LAYER+0.01
/obj/machinery/power/terminal/New()
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/effect/projectile
icon = 'icons/effects/projectiles.dmi'
icon_state = "bolt"
layer = 20
plane = ABOVE_PLANE
/obj/effect/projectile/New(var/turf/location)
if(istype(location))

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