Merge pull request #3378 from VOREStation/polaris-sync-2018-03-30

Polaris Sync 2018-03-30
This commit is contained in:
Leshana
2018-04-06 14:42:19 -04:00
committed by GitHub
237 changed files with 2151 additions and 1421 deletions
+1
View File
@@ -7,6 +7,7 @@ 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_and_message_admins is for this
for(var/client/C in admins)
if((R_ADMIN|R_MOD) & C.holder.rights)
C << msg
+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
@@ -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)
+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
@@ -140,6 +140,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
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, "Ian Storm", /datum/event/ianstorm, 50),
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))
+14 -1
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
@@ -795,5 +795,18 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
/mob/observer/dead/is_deaf()
return FALSE
/mob/observer/dead/verb/paialert()
set category = "Ghost"
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
if(usr.client.prefs.be_special & BE_PAI)
for(var/obj/item/device/paicard/p in world)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit
PP.overlays += "pai-ghostalert"
spawn(54)
PP.overlays.Cut()
/mob/observer/dead/speech_bubble_appearance()
return "ghost"
@@ -1,16 +1,3 @@
/mob/observer/dead/verb/paialert()
set category = "Ghost"
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
if(usr.client.prefs.be_special & BE_PAI)
for(var/obj/item/device/paicard/p in world)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
PP.icon = 'icons/obj/pda_vr.dmi'
PP.overlays += "pai-ghostalert"
spawn(54)
PP.overlays.Cut()
/mob/observer/dead/verb/nifjoin()
set category = "Ghost"
set name = "Join Into Soulcatcher"
-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)
-1
View File
@@ -139,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 -3
View File
@@ -61,9 +61,9 @@
colour = "terminus"
key = "4"
flags = WHITELISTED
syllables = list ("die", "en", "skei", "van", "son", "der", "aar", "ch", "op", "ruk", "aa", "be", "ne", "het",
"ek", "ras", "ver", "zan", "das", "waa", "geb", "vol", "lu", "min", "breh", "rus", "stv", "ee", "goe", "sk",
"la", "ver", "we", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "du", "jaa", "ch", "kk", "gh", "ll", "uu", "wat")
syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl",
"sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
"uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
// Criminal language.
/datum/language/gutter
+1 -1
View File
@@ -99,7 +99,7 @@
return (copytext(message, length(message)) == "!") ? 2 : 1
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("(HIVE) [message]", src)
log_say("(HIVE) [message]", speaker)
if(!speaker_mask) speaker_mask = speaker.name
message = format_message(message, get_spoken_verb(message))
@@ -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
@@ -6,6 +6,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = ITEMSIZE_NORMAL
can_speak = 1
origin_tech = list(TECH_BIO = 3)
req_access = list(access_robotics)
+2 -2
View File
@@ -5,8 +5,8 @@
message = sanitize(message)
if(!(container && istype(container, /obj/item/device/mmi)))
return //No MMI, can't speak, bucko./N
if(!(container && container.can_speak))
return //Certain objects can speak, like MMIs. Most others cannot. -Q
else
var/datum/language/speaking = parse_language(message)
if(speaking)
@@ -1573,7 +1573,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)
@@ -1583,8 +1583,9 @@
/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
@@ -279,20 +279,3 @@
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
+1 -30
View File
@@ -853,28 +853,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))
@@ -906,14 +884,7 @@
var/growlsound = pick(hunger_sounds)
var/growlmultiplier = 100 - (nutrition / 250 * 100)
playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
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++
// VOREStation Edit End
// TODO: stomach and bloodstream organ.
if(!isSynthetic())
@@ -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)
@@ -407,3 +407,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++
@@ -339,7 +339,7 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/hide_humanoid,
/mob/living/proc/hide,
/mob/living/proc/shred_limb,
/mob/living/proc/toggle_pass_table
)
@@ -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
+1 -3
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
@@ -881,7 +880,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
@@ -1226,7 +1224,7 @@ default behaviour is:
return UNDERWATER
else
return ..()
//Add an entry to overlays, assuming it exists
/mob/living/proc/apply_hud(cache_index, var/image/I)
hud_list[cache_index] = I
+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>")
+5 -3
View File
@@ -308,7 +308,6 @@ proc/get_radio_key_from_channel(var/channel)
var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
images_to_clients[speech_bubble] = list()
// Attempt Multi-Z Talking
var/mob/above = src.shadow
while(!QDELETED(above))
@@ -375,8 +374,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
@@ -131,7 +131,7 @@
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
ui = new(user, user, id, "crew_manifest.tmpl", "Crew Manifest", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
@@ -199,6 +199,21 @@
wrapped = null
//update_icon()
/obj/item/weapon/gripper/proc/drop_item_nm()
if(!wrapped)
for(var/obj/item/thing in src.contents)
thing.loc = get_turf(src)
return
if(wrapped.loc != src)
wrapped = null
return
wrapped.loc = get_turf(src)
wrapped = null
//update_icon()
/obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack().
force_holder = wrapped.force
@@ -1114,4 +1114,10 @@
return
/mob/living/silicon/robot/is_sentient()
return braintype != "Drone"
return braintype != "Drone"
/mob/living/silicon/robot/drop_item()
if(module_active && istype(module_active,/obj/item/weapon/gripper))
var/obj/item/weapon/gripper/G = module_active
G.drop_item_nm()
@@ -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"
@@ -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.
+2 -1
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
+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 -1
View File
@@ -635,7 +635,7 @@ var/global/image/backplane
else
var/area/A = get_area(src)
return A.sound_env
/mob/proc/position_hud_item(var/obj/item/item, var/slot)
if(!istype(hud_used) || !slot || !LAZYLEN(hud_used.slot_info))
return
+1 -1
View File
@@ -135,7 +135,7 @@
//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
layer = LAYER_HUD_BASE+1 // This MUST be above the lighting plane_master
color = null //To break lighting when visible (this is sorta backwards)
alpha = 0 //Starts full opaque
invisibility = 101
+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))
+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>"
+1 -1
View File
@@ -58,7 +58,7 @@ var/global/list/limb_icon_cache = list()
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
//Eye color/icon
var/should_have_eyes = owner.should_have_organ(O_EYES)
var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR
+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 -11
View File
@@ -16,7 +16,8 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -132,7 +133,6 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "bulb-construct-stage1"
anchored = 1
layer = 5
stage = 1
fixture_type = "bulb"
sheets_refunded = 1
@@ -143,6 +143,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flamp-construct-stage1"
anchored = 0
plane = OBJ_PLANE
layer = OBJ_LAYER
stage = 1
fixture_type = "flamp"
@@ -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_PLANE
layer = ABOVE_MOB_LAYER
use_power = 2
idle_power_usage = 2
active_power_usage = 20
@@ -197,6 +199,7 @@
fitting = "bulb"
brightness_range = 5
brightness_power = 2
plane = OBJ_PLANE
layer = OBJ_LAYER
brightness_color = "#FFF4E5"
desc = "A floor lamp."
@@ -204,11 +207,6 @@
shows_alerts = FALSE
var/lamp_shade = 1
//Vorestation addition, to override the New() proc further below, since this is a lamp.
/obj/machinery/light/flamp/New()
..()
layer = OBJ_LAYER
/obj/machinery/light/small/emergency
brightness_range = 4
brightness_power = 2
@@ -259,9 +257,6 @@
broken(1)
spawn(1)
update(0)
//Vorestation addition, so large mobs stop looking stupid in front of lights.
if (dir == 2)
layer = 5
/obj/machinery/light/Destroy()
var/area/A = get_area(src)
+5 -12
View File
@@ -1,26 +1,19 @@
// I hate the way macros look stupid standing near lights. I don't care how absurd this looks.
/obj/machinery/light_construct
layer = 4
/obj/machinery/light_construct/small
layer = 4
/obj/machinery/light_construct/flamp
layer = 4
layer = BELOW_MOB_LAYER
/obj/machinery/light
layer = 4
layer = BELOW_MOB_LAYER
//Vorestation addition, to override the New() proc further below, since this is a lamp.
/obj/machinery/light/flamp/New()
..()
layer = 4
layer = initial(layer)
// create a new lighting fixture
/obj/machinery/light/New()
..()
//Vorestation addition, so large mobs stop looking stupid in front of lights.
if (dir == 2)
layer = 5
if (dir == SOUTH) // Lights are backwards, SOUTH lights face north (they are on south wall)
layer = ABOVE_MOB_LAYER
@@ -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))
+8
View File
@@ -49,6 +49,7 @@
//Effects
var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech
var/flammability = 0 //Amount of fire stacks to add for the above.
var/combustion = TRUE //Does this set off flammable objects on fire/hit?
var/stun = 0
var/weaken = 0
var/paralyze = 0
@@ -90,6 +91,10 @@
//called when the projectile stops flying because it collided with something
/obj/item/projectile/proc/on_impact(var/atom/A)
impact_effect(effect_transform) // generate impact effect
if(damage && damage_type == BURN)
var/turf/T = get_turf(A)
if(T)
T.hotspot_expose(700, 5)
return
//Checks if the projectile is eligible for embedding. Not that it necessarily will.
@@ -132,6 +137,9 @@
if (!istype(targloc) || !istype(curloc))
return 1
if(combustion)
curloc.hotspot_expose(700, 5)
if(targloc == curloc) //Shooting something in the same turf
target.bullet_act(src, target_zone)
on_impact(target)
@@ -8,6 +8,7 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
combustion = FALSE
/obj/item/projectile/animate/Bump(var/atom/change)
if((istype(change, /obj/item) || istype(change, /obj/structure)) && !is_type_in_list(change, protected_objects))
@@ -122,6 +122,8 @@
check_armour = "laser"
light_color = "#0066FF"
combustion = FALSE
muzzle_type = /obj/effect/projectile/laser_blue/muzzle
tracer_type = /obj/effect/projectile/laser_blue/tracer
impact_type = /obj/effect/projectile/laser_blue/impact
@@ -142,6 +144,8 @@
check_armour = "laser"
light_color = "#FF0D00"
combustion = FALSE
/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/M = target
@@ -157,6 +161,8 @@
check_armour = "laser"
light_color = "#00C6FF"
combustion = FALSE
muzzle_type = /obj/effect/projectile/laser_omni/muzzle
tracer_type = /obj/effect/projectile/laser_omni/tracer
impact_type = /obj/effect/projectile/laser_omni/impact
@@ -190,6 +196,8 @@
damage_type = HALLOSS
light_color = "#FFFFFF"
combustion = FALSE
muzzle_type = /obj/effect/projectile/stun/muzzle
tracer_type = /obj/effect/projectile/stun/tracer
impact_type = /obj/effect/projectile/stun/impact
@@ -191,6 +191,8 @@
sharp = 0
check_armour = "melee"
combustion = FALSE
/obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0)
..()
empulse(target, 0, 0, 0, 0) //Only affects what it hits
@@ -325,6 +327,8 @@
embed_chance = 0
sharp = 0
combustion = FALSE
/obj/item/projectile/bullet/pistol/cap/process()
loc = null
qdel(src)
@@ -6,6 +6,8 @@
nodamage = 1
check_armour = "energy"
combustion = FALSE
/obj/item/projectile/change/on_hit(var/atom/change)
wabbajack(change)
@@ -92,6 +92,7 @@
light_power = 0.5
light_color = "#33CC00"
combustion = FALSE
/obj/item/projectile/energy/dart
name = "dart"
@@ -101,6 +102,7 @@
agony = 120
check_armour = "energy"
combustion = FALSE
/obj/item/projectile/energy/bolt
name = "bolt"
@@ -122,6 +124,8 @@
agony = 10
check_armour = "bio"
combustion = FALSE
/obj/item/projectile/energy/neurotoxin
name = "neurotoxic spit"
icon_state = "neurotoxin"
@@ -130,6 +134,8 @@
agony = 80
check_armour = "bio"
combustion = FALSE
/obj/item/projectile/energy/neurotoxin/toxic //New alien mob projectile to match the player-variant's projectiles.
name = "neurotoxic spit"
icon_state = "neurotoxin"
@@ -149,6 +155,8 @@
light_power = 0.5
light_color = "#33CC00"
combustion = FALSE
/obj/item/projectile/energy/plasmastun
name = "plasma pulse"
icon_state = "plasma_stun"
@@ -5,6 +5,8 @@
damage = 20
check_armour = "energy"
combustion = FALSE
/obj/item/projectile/forcebolt/strong
name = "force bolt"
@@ -9,6 +9,9 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
combustion = FALSE
var/sev1_range = 0
var/sev2_range = 1
var/sev3_range = 1
@@ -56,6 +59,8 @@
light_power = 0.5
light_color = "#55AAFF"
combustion = FALSE
/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)
..()
if(isliving(target))
@@ -85,6 +90,8 @@
name = "heat beam"
target_temperature = 1000
combustion = TRUE
/obj/item/projectile/meteor
name = "meteor"
icon = 'icons/obj/meteor.dmi'
@@ -127,6 +134,8 @@
light_power = 0.5
light_color = "#33CC00"
combustion = FALSE
/obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
if(ishuman(target))
@@ -196,6 +205,8 @@
/obj/item/projectile/beam/mindflayer
name = "flayer ray"
combustion = FALSE
/obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
var/mob/living/carbon/human/M = target
@@ -218,6 +229,8 @@
damage_type = HALLOSS
muzzle_type = null
combustion = FALSE
/obj/item/projectile/bola/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
var/mob/living/carbon/human/M = target
@@ -235,6 +248,8 @@
damage_type = BRUTE
muzzle_type = null
combustion = FALSE
/obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0)
if(isturf(target.loc))
var/obj/effect/spider/stickyweb/W = locate() in get_turf(target)
@@ -281,7 +281,6 @@
name = "All-In-One Grinder"
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
layer = 2.9
density = 0
anchored = 0
use_power = 1
@@ -453,6 +453,9 @@
if(adj_temp < 0 && M.bodytemperature > 310)
M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
/datum/reagent/drink/overdose(var/mob/living/carbon/M, var/alien) //Add special interactions here in the future if desired.
..()
// Juices
/datum/reagent/drink/juice/banana
@@ -1047,11 +1050,14 @@
adj_dizzy = -5
adj_drowsy = -3
adj_sleepy = -2
overdose = 45
glass_name = "Coffee Milkshake"
glass_desc = "An energizing coffee milkshake, perfect for hot days at work.."
/datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien)
M.make_jittery(5)
/datum/reagent/drink/rewriter
name = "Rewriter"
id = "rewriter"
@@ -2847,4 +2853,4 @@
adj_temp = -5
glass_name = "Mint Julep"
glass_desc = "Minty and refreshing, perfect for a hot day."
glass_desc = "Minty and refreshing, perfect for a hot day."
@@ -532,7 +532,7 @@
/datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
//Based roughly on Levofloxacin's rather severe side-effects
if(prob(20))
M.Confuse(5)
@@ -49,6 +49,60 @@
id = "crayon_dust_brown"
color = "#846F35"
/datum/reagent/marker_ink
name = "Marker ink"
id = "marker_ink"
description = "Intensely coloured ink used in markers."
taste_description = "extremely bitter"
reagent_state = LIQUID
color = "#888888"
overdose = 5
/datum/reagent/marker_ink/black
name = "Black marker ink"
id = "marker_ink_black"
color = "#000000"
/datum/reagent/marker_ink/red
name = "Red marker ink"
id = "marker_ink_red"
color = "#FE191A"
/datum/reagent/marker_ink/orange
name = "Orange marker ink"
id = "marker_ink_orange"
color = "#FFBE4F"
/datum/reagent/marker_ink/yellow
name = "Yellow marker ink"
id = "marker_ink_yellow"
color = "#FDFE7D"
/datum/reagent/marker_ink/green
name = "Green marker ink"
id = "marker_ink_green"
color = "#18A31A"
/datum/reagent/marker_ink/blue
name = "Blue marker ink"
id = "marker_ink_blue"
color = "#247CFF"
/datum/reagent/marker_ink/purple
name = "Purple marker ink"
id = "marker_ink_purple"
color = "#CC0099"
/datum/reagent/marker_ink/grey //Mime
name = "Grey marker ink"
id = "marker_ink_grey"
color = "#808080"
/datum/reagent/marker_ink/brown //Rainbow
name = "Brown marker ink"
id = "marker_ink_brown"
color = "#846F35"
/datum/reagent/paint
name = "Paint"
id = "paint"
+8 -8
View File
@@ -881,7 +881,7 @@
name = "Red paint"
id = "red_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_red" = 1)
result_amount = 5
/datum/chemical_reaction/red_paint/send_data()
@@ -891,7 +891,7 @@
name = "Orange paint"
id = "orange_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_orange" = 1)
result_amount = 5
/datum/chemical_reaction/orange_paint/send_data()
@@ -901,7 +901,7 @@
name = "Yellow paint"
id = "yellow_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_yellow" = 1)
result_amount = 5
/datum/chemical_reaction/yellow_paint/send_data()
@@ -911,7 +911,7 @@
name = "Green paint"
id = "green_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_green" = 1)
result_amount = 5
/datum/chemical_reaction/green_paint/send_data()
@@ -921,7 +921,7 @@
name = "Blue paint"
id = "blue_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_blue" = 1)
result_amount = 5
/datum/chemical_reaction/blue_paint/send_data()
@@ -931,7 +931,7 @@
name = "Purple paint"
id = "purple_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_purple" = 1)
result_amount = 5
/datum/chemical_reaction/purple_paint/send_data()
@@ -941,7 +941,7 @@
name = "Grey paint"
id = "grey_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_grey" = 1)
result_amount = 5
/datum/chemical_reaction/grey_paint/send_data()
@@ -951,7 +951,7 @@
name = "Brown paint"
id = "brown_paint"
result = "paint"
required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1)
required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_brown" = 1)
result_amount = 5
/datum/chemical_reaction/brown_paint/send_data()
@@ -216,7 +216,8 @@
if(trans)
to_chat(user, "<span class='notice'>You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.</span>")
add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units")
if(ismob(target))
add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units")
else
to_chat(user, "<span class='notice'>The syringe is empty.</span>")
+2 -1
View File
@@ -6,7 +6,8 @@
icon_state = "conveyor0"
name = "conveyor belt"
desc = "A conveyor belt."
layer = 2 // so they appear under stuff
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
anchored = 1
circuit = /obj/item/weapon/circuitboard/conveyor
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
+1 -1
View File
@@ -663,7 +663,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
layer = 2.3 // slightly lower than wires and other pipes
layer = DISPOSAL_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/sortType = ""
var/subtype = 0
+16
View File
@@ -1802,6 +1802,22 @@ CIRCUITS BELOW
build_path = /obj/item/device/universal_translator/ear
sort_string = "HABQB"
/datum/design/obj/item/device/xenoarch_multi_tool
name = "xenoarcheology multitool"
id = "xenoarch_multitool"
req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3)
build_path = /obj/item/device/xenoarch_multi_tool
materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500)
sort_string = "HABQC"
/datum/design/excavationdrill
name = "Excavation Drill"
id = "excavationdrill"
req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
build_type = PROTOLATHE
materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
build_path = /obj/item/weapon/pickaxe/excavationdrill
/* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert
name = "general alert console"
+2 -1
View File
@@ -15,7 +15,8 @@
icon_state = "shield"
alpha = 100
anchored = 1
layer = 4.1 //just above mobs
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
density = 0
var/obj/machinery/shield_gen/my_gen = null
var/strength = 0 // in Renwicks
@@ -56,7 +56,8 @@ How they spawn stuff is decided by behaviour vars, which are explained below
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/effects/effects.dmi'
animation.layer = 3
animation.plane = OBJ_PLANE
animation.layer = ABOVE_JUNK_LAYER
animation.master = summoned_object
for(var/varName in newVars)
@@ -26,7 +26,8 @@
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
animation.layer = 5
animation.plane = MOB_PLANE
animation.layer = ABOVE_MOB_LAYER
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
+3 -2
View File
@@ -84,7 +84,8 @@
set_dir(direction)
if(dir != NORTH)
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
climbable = 0 //flipping tables allows them to be used as makeshift barriers
flipped = 1
flags |= ON_BORDER
@@ -102,7 +103,7 @@
verbs -=/obj/structure/table/proc/do_put
verbs +=/obj/structure/table/verb/do_flip
layer = initial(layer)
reset_plane_and_layer()
flipped = 0
climbable = initial(climbable)
flags &= ~ON_BORDER
+1 -1
View File
@@ -8,7 +8,7 @@ var/list/table_icon_cache = list()
density = 1
anchored = 1
climbable = 1
layer = 2.8
layer = TABLE_LAYER
throwpass = 1
surgery_odds = 66
var/flipped = 0
+1 -1
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/turbolift.dmi'
anchored = 1
density = 0
layer = 4
plane = MOB_PLANE
var/datum/turbolift/lift
+2 -1
View File
@@ -182,7 +182,8 @@ var/list/ventcrawl_machinery = list(
for(var/datum/pipeline/pipeline in network.line_members)
for(var/obj/machinery/atmospherics/A in (pipeline.members || pipeline.edges))
if(!A.pipe_image)
A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir)
A.pipe_image = image(A, A.loc, dir = A.dir)
A.pipe_image.plane = PLANE_LIGHTING_ABOVE
pipes_shown += A.pipe_image
client.images += A.pipe_image
if(client)
+1 -1
View File
@@ -82,7 +82,7 @@
majormutate()
//Space antibiotics have a good chance to stop disease completely
if(mob.reagents.has_reagent("spaceacillin"))
if(mob.chem_effects[CE_ANTIBIOTIC])
if(stage == 1 && prob(70-resistance))
src.cure(mob)
else
+1 -1
View File
@@ -81,7 +81,7 @@ proc/airborne_can_reach(turf/source, turf/target)
var/list/antibodies_in_common = M.antibodies & disease.antigen
if(antibodies_in_common.len)
return
if(M.reagents.has_reagent("spaceacillin"))
if(M.chem_effects[CE_ANTIBIOTIC])
if(prob(disease.resistance))
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
@@ -7,7 +7,7 @@
var/drill_time = 10
var/turf/drilling_turf
density = 1
layer = 3.1 //to go over ores
layer = ABOVE_JUNK_LAYER
/obj/machinery/giga_drill/attack_hand(mob/user as mob)
if(active)
+15 -4
View File
@@ -29,11 +29,22 @@
C.scan_atom(user, src)
return
if(istype(I, /obj/item/device/xenoarch_multi_tool))
var/obj/item/device/xenoarch_multi_tool/C = I
if(C.mode) //Mode means scanning.
C.depth_scanner.scan_atom(user, src)
return
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 [2 * src.excavation_level]cm.</span>")
return
if(istype(I, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = I
user.visible_message("<span class='notice'>\The [user] extends \the [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 [2 * src.excavation_level]cm.</span>"
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.</span>")
return
if(istype(I, /obj/item/weapon/pickaxe))
@@ -43,12 +54,12 @@
return
last_act = world.time
user << "<span class='warning'>You start [P.drill_verb] [src].</span>"
to_chat(user, "<span class='warning'>You start [P.drill_verb] [src].</span>")
if(!do_after(user, P.digspeed))
return
user << "<span class='notice'>You finish [P.drill_verb] [src].</span>"
to_chat(user, "<span class='notice'>You finish [P.drill_verb] [src].</span>")
excavation_level += P.excavation_amount
if(excavation_level > 100)
@@ -87,4 +98,4 @@
else if(istype(AM,/obj/mecha))
var/obj/mecha/M = AM
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill))
M.selected.action(src)
M.selected.action(src)
+42 -6
View File
@@ -80,13 +80,13 @@
SSxenoarch.digsite_spawning_turfs.Remove(T)
if(nearestTargetDist >= 0)
user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]"
to_chat(user, "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]")
else if(nearestSimpleTargetDist >= 0)
user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m."
to_chat(user, "Small anomaly detected in a radius of [nearestSimpleTargetDist]m.")
else
user << "Background radiation levels detected."
to_chat(user, "Background radiation levels detected.")
else
user << "Scanning array is recharging."
to_chat(user, "Scanning array is recharging.")
/obj/item/device/depth_scanner
name = "depth analysis scanner"
@@ -133,7 +133,7 @@
positive_locations.Add(D)
user << "<span class='notice'>\icon[src] [src] pings.</span>"
to_chat(user, "<span class='notice'>\icon[src] [src] pings.</span>")
else if(istype(A, /obj/structure/boulder))
var/obj/structure/boulder/B = A
@@ -151,7 +151,7 @@
positive_locations.Add(D)
user << "<span class='notice'>\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!</span>"
to_chat(user, "<span class='notice'>\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!</span>")
/obj/item/device/depth_scanner/attack_self(var/mob/living/user)
interact(user)
@@ -310,3 +310,39 @@
usr << browse(null, "window=locater")
updateSelfDialog()
/obj/item/device/xenoarch_multi_tool
name = "xenoarcheology multitool"
desc = "Has the features of the Alden-Saraspova counter, a measuring tape, and a depth analysis scanner all in one!"
icon_state = "ano_scanner2"
item_state = "lampgreen"
icon = 'icons/obj/xenoarchaeology.dmi'
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
var/mode = 1 //Start off scanning. 1 = scanning, 0 = measuring
var/obj/item/device/ano_scanner/anomaly_scanner = null
var/obj/item/device/depth_scanner/depth_scanner = null
/obj/item/device/xenoarch_multi_tool/New()
anomaly_scanner = new/obj/item/device/ano_scanner(src)
depth_scanner = new/obj/item/device/depth_scanner(src)
/obj/item/device/xenoarch_multi_tool/attack_self(var/mob/living/user)
depth_scanner.interact(user)
/obj/item/device/xenoarch_multi_tool/verb/swap_settings(var/mob/living/user)
set name = "Swap Functionality"
set desc = "Swap between the scanning and measuring functionality.."
mode = !mode
if(mode)
to_chat(user, "The device will now scan for artifacts.")
else
to_chat(user, "The device will now measure depth dug.")
/obj/item/device/xenoarch_multi_tool/verb/scan_for_anomalies(var/mob/living/user)
set name = "Scan for Anomalies"
set desc = "Scan for artifacts and anomalies within your vicinity."
anomaly_scanner.interact(user)
@@ -149,3 +149,43 @@
smallest.loc = src
picksToSort -= smallest
orient2hud()
/obj/item/weapon/pickaxe/excavationdrill
name = "excavation drill"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "excavationdrill2"
item_state = "syringe_0"
excavation_amount = 15
digspeed = 30
desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The tip is adjustable from 1 to 30 cm."
drill_sound = 'sound/weapons/thudswoosh.ogg'
drill_verb = "drilling"
force = 5
w_class = 2
attack_verb = list("drilled")
/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob)
var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num
if(depth>30 || depth<1)
to_chat(user, "<span class='notice'>Invalid depth.</span>")
return
excavation_amount = depth
to_chat(user, "<span class='notice'>You set the depth to [depth]cm.</span>")
switch(depth)
if(1 to 5)
icon_state = "excavationdrill0"
if(6 to 10)
icon_state = "excavationdrill1"
if(11 to 15)
icon_state = "excavationdrill2"
if(16 to 20)
icon_state = "excavationdrill3"
if(21 to 25)
icon_state = "excavationdrill4"
if(25 to 30)
icon_state = "excavationdrill5" //The other 2 sprites are comically long. Let's just cut it at 5.
/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user)
..()
var/depth = excavation_amount
to_chat(user, "<span class='info'>It is currently set at [depth]cms.</span>")