Merge remote-tracking branch 'ParadiseSS13/master' into forum_integration_improvement

This commit is contained in:
Kyep
2020-01-06 19:28:51 -08:00
232 changed files with 2083 additions and 1066 deletions
+4 -4
View File
@@ -469,13 +469,13 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
if(playercid)
cidsearch = "AND computerid = '[playercid]' "
else
if(adminckey && lentext(adminckey) >= 3)
if(adminckey && length(adminckey) >= 3)
adminsearch = "AND a_ckey LIKE '[adminckey]%' "
if(playerckey && lentext(playerckey) >= 3)
if(playerckey && length(playerckey) >= 3)
playersearch = "AND ckey LIKE '[playerckey]%' "
if(playerip && lentext(playerip) >= 3)
if(playerip && length(playerip) >= 3)
ipsearch = "AND ip LIKE '[playerip]%' "
if(playercid && lentext(playercid) >= 7)
if(playercid && length(playercid) >= 7)
cidsearch = "AND computerid LIKE '[playercid]%' "
if(dbbantype)
+10 -1
View File
@@ -1,5 +1,5 @@
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key, address, computer_id, check_ipintel = TRUE)
world/IsBanned(key, address, computer_id, type, check_ipintel = TRUE)
if(!config.ban_legacy_system)
if(address)
@@ -11,11 +11,20 @@ world/IsBanned(key, address, computer_id, check_ipintel = TRUE)
log_adminwarn("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
if(type == "world")
return ..() //shunt world topic banchecks to purely to byond's internal ban system
if(text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
log_adminwarn("Failed Login (invalid cid): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.")
var/admin = 0
var/ckey = ckey(key)
var/client/C = GLOB.directory[ckey]
if (C && ckey == C.ckey && computer_id == C.computer_id && address == C.address)
return //don't recheck connected clients.
if((ckey in admin_datums) || (ckey in GLOB.deadmins))
var/datum/admins/A = admin_datums[ckey]
if(A && (A.rights & R_ADMIN))
+4 -4
View File
@@ -3077,7 +3077,7 @@
else if(href_list["ac_set_channel_name"])
src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
while(findtext(src.admincaster_feed_channel.channel_name," ") == 1)
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,length(src.admincaster_feed_channel.channel_name)+1)
src.access_news_network()
else if(href_list["ac_set_channel_lock"])
@@ -3116,7 +3116,7 @@
else if(href_list["ac_set_new_message"])
src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", ""))
while(findtext(src.admincaster_feed_message.body," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,length(src.admincaster_feed_message.body)+1)
src.access_news_network()
else if(href_list["ac_submit_new_message"])
@@ -3170,13 +3170,13 @@
else if(href_list["ac_set_wanted_name"])
src.admincaster_feed_message.author = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
while(findtext(src.admincaster_feed_message.author," ") == 1)
src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,lentext(admincaster_feed_message.author)+1)
src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,length(admincaster_feed_message.author)+1)
src.access_news_network()
else if(href_list["ac_set_wanted_desc"])
src.admincaster_feed_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
while(findtext(src.admincaster_feed_message.body," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,length(src.admincaster_feed_message.body)+1)
src.access_news_network()
else if(href_list["ac_submit_wanted"])
+9 -6
View File
@@ -26,7 +26,7 @@ var/global/list/frozen_mob_list = list()
/mob/living/var/frozen = null //used for preventing attacks on admin-frozen mobs
/mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze
/mob/living/proc/admin_Freeze(var/client/admin, skip_overlays = FALSE)
/mob/living/proc/admin_Freeze(client/admin, skip_overlays = FALSE)
if(istype(admin))
to_chat(src, "<b><font color= red>You have been frozen by [admin]</b></font>")
message_admins("<span class='notice'>[key_name_admin(admin)]</span> froze [key_name_admin(src)]")
@@ -34,24 +34,27 @@ var/global/list/frozen_mob_list = list()
var/obj/effect/overlay/adminoverlay/AO = new
if(skip_overlays)
src.overlays += AO
overlays += AO
anchored = 1
frozen = AO
anchored = TRUE
canmove = FALSE
admin_prev_sleeping = sleeping
AdjustSleeping(20000)
frozen = AO
if(!(src in frozen_mob_list))
frozen_mob_list += src
/mob/living/proc/admin_unFreeze(var/client/admin, skip_overlays = FALSE)
/mob/living/proc/admin_unFreeze(client/admin, skip_overlays = FALSE)
if(istype(admin))
to_chat(src, "<b><font color= red>You have been unfrozen by [admin]</b></font>")
message_admins("<span class='notice'>[key_name_admin(admin)] unfroze [key_name_admin(src)]</span>")
log_admin("[key_name(admin)] unfroze [key_name(src)]")
anchored = 0
if(skip_overlays)
overlays -= frozen
anchored = FALSE
canmove = TRUE
frozen = null
SetSleeping(admin_prev_sleeping)
admin_prev_sleeping = null
+4 -4
View File
@@ -306,11 +306,11 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
// the type with the base type removed from the begaining
var/fancytype = types[D.type]
if(findtext(fancytype, types[type]))
fancytype = copytext(fancytype, lentext(types[type])+1)
var/shorttype = copytext("[D.type]", lentext("[type]")+1)
if(lentext(shorttype) > lentext(fancytype))
fancytype = copytext(fancytype, length(types[type])+1)
var/shorttype = copytext("[D.type]", length("[type]")+1)
if(length(shorttype) > length(fancytype))
shorttype = fancytype
if(!lentext(shorttype))
if(!length(shorttype))
shorttype = "/"
.["[D]([shorttype])\ref[D]#[i]"] = D
+4 -2
View File
@@ -989,12 +989,14 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_string in command_positions)
job_string = "<U>" + job_string + "</U>"
role_string = "-"
obj_count = 0
obj_string = ""
if(H.mind)
if(H.mind.special_role)
role_string = "<U>[H.mind.special_role]</U>"
if(!H.key && H.mind.key)
key_string = H.mind.key
for(var/datum/objective/O in all_objectives)
for(var/datum/objective/O in GLOB.all_objectives)
if(O.target == H.mind)
obj_count++
if(obj_count > 0)
@@ -1033,7 +1035,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
role_string = "<U>[H.mind.special_role]</U>"
if(!H.key && H.mind.key)
key_string = H.mind.key
for(var/datum/objective/O in all_objectives)
for(var/datum/objective/O in GLOB.all_objectives)
if(O.target == H.mind)
obj_count++
if(obj_count > 0)
@@ -3,8 +3,8 @@
/datum/antagonist/mindslave
name = "Mindslave"
roundend_category = "mindslaves"
job_rank = ROLE_MINDSLAVE
var/special_role = ROLE_MINDSLAVE
job_rank = SPECIAL_ROLE_TRAITOR
var/special_role = SPECIAL_ROLE_TRAITOR
/datum/antagonist/mindslave/on_gain()
owner.special_role = special_role
@@ -6,7 +6,7 @@
name = "Traitor"
roundend_category = "traitors"
job_rank = ROLE_TRAITOR
var/special_role = ROLE_TRAITOR
var/special_role = SPECIAL_ROLE_TRAITOR
var/give_objectives = TRUE
var/should_give_codewords = TRUE
var/should_equip = TRUE
@@ -28,6 +28,7 @@
forge_traitor_objectives()
if(!silent)
greet()
apply_innate_effects()
update_traitor_icons_added()
finalize_traitor()
@@ -54,6 +55,7 @@
assigned_targets.Cut()
SSticker.mode.traitors -= owner
owner.special_role = null
remove_innate_effects()
update_traitor_icons_removed()
if(!silent && owner.current)
@@ -67,8 +69,10 @@
if(owner.assigned_role == "Clown")
var/mob/living/carbon/human/traitor_mob = owner.current
if(traitor_mob && istype(traitor_mob))
to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
to_chat(traitor_mob, "<span class='warning'>Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.</span>")
traitor_mob.mutations.Remove(CLUMSY)
var/datum/action/innate/toggle_clumsy/A = new
A.Grant(traitor_mob)
/datum/antagonist/traitor/remove_innate_effects()
@@ -76,7 +80,11 @@
if(owner.assigned_role == "Clown")
var/mob/living/carbon/human/traitor_mob = owner.current
if(traitor_mob && istype(traitor_mob))
to_chat(traitor_mob, "<span class='warning'>You lose your syndicate training and return to your own clumsy, clownish self.</span>")
traitor_mob.mutations.Add(CLUMSY)
for(var/datum/action/innate/A in traitor_mob.actions)
if(istype(A, /datum/action/innate/toggle_clumsy))
A.Remove(traitor_mob)
// Adding/removing objectives in the owner's mind until we can datumize all antags. Then we can use the /datum/antagonist/objectives var to handle them
// Change "owner.objectives" to "objectives" once objectives are handled in antag datums instead of the mind
@@ -205,7 +205,7 @@
if(inawaymission)
if(ismob(loc))
to_chat(loc, "<span class='danger'>Your [src] deactivates, as it is out of range from its power source.</span>")
power_supply.charge = 0
cell.charge = 0
inawaymission = 0
update_icon()
+3 -3
View File
@@ -360,10 +360,10 @@
. = ..() //calls mob.Login()
if(ckey in clientmessages)
for(var/message in clientmessages[ckey])
if(ckey in GLOB.clientmessages)
for(var/message in GLOB.clientmessages[ckey])
to_chat(src, message)
clientmessages.Remove(ckey)
GLOB.clientmessages.Remove(ckey)
if(SSinput.initialized)
set_macros()
+5 -4
View File
@@ -1,9 +1,10 @@
var/list/clientmessages = list()
GLOBAL_LIST_EMPTY(clientmessages)
proc/addclientmessage(var/ckey, var/message)
ckey = ckey(ckey)
if(!ckey || !message)
return
if(!(ckey in clientmessages))
clientmessages[ckey] = list()
clientmessages[ckey] += message
var/list/L = GLOB.clientmessages[ckey]
if(!L)
GLOB.clientmessages[ckey] = L = list()
L += message
@@ -1,38 +1,40 @@
/datum/gear/racial
sort_category = "Racial"
subtype_path = /datum/gear/racial
/datum/gear/racial/taj
slot = slot_glasses
cost = 2
/datum/gear/racial/tajciv
/datum/gear/racial/taj/civ
display_name = "embroidered veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind
cost = 1
/datum/gear/racial/tajsec
/datum/gear/racial/taj/sec
display_name = "sleek veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built security HUD."
path = /obj/item/clothing/glasses/hud/security/tajblind
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent", "Magistrate")
/datum/gear/racial/tajmed
/datum/gear/racial/taj/med
display_name = "lightweight veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD."
path = /obj/item/clothing/glasses/hud/health/tajblind
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
/datum/gear/racial/tajsci
/datum/gear/racial/taj/sci
display_name = "hi-tech veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/sci
/datum/gear/racial/tajeng
/datum/gear/racial/taj/eng
display_name = "industrial veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/eng
/datum/gear/racial/tajcargo
/datum/gear/racial/taj/cargo
display_name = "khaki veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
path = /obj/item/clothing/glasses/tajblind/cargo
@@ -40,4 +42,5 @@
/datum/gear/racial/footwraps
display_name = "cloth footwraps"
path = /obj/item/clothing/shoes/footwraps
cost = 1
slot = slot_shoes
cost = 1
@@ -294,8 +294,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>Disabilities:</b> <a href='?_src_=prefs;preference=disabilities'>\[Set\]</a><br>"
dat += "<b>Nanotrasen Relation:</b> <a href ='?_src_=prefs;preference=nt_relation;task=input'>[nanotrasen_relation]</a><br>"
dat += "<a href='byond://?_src_=prefs;preference=flavor_text;task=input'>Set Flavor Text</a><br>"
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text)) dat += "\[...\]<br>"
if(length(flavor_text) <= 40)
if(!length(flavor_text)) dat += "\[...\]<br>"
else dat += "[flavor_text]<br>"
else dat += "[TextPreview(flavor_text)]...<br>"
@@ -886,21 +886,21 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
HTML += "<a href=\"byond://?_src_=prefs;preference=records;task=med_record\">Medical Records</a><br>"
if(lentext(med_record) <= 40)
if(length(med_record) <= 40)
HTML += "[med_record]"
else
HTML += "[copytext(med_record, 1, 37)]..."
HTML += "<br><a href=\"byond://?_src_=prefs;preference=records;task=gen_record\">Employment Records</a><br>"
if(lentext(gen_record) <= 40)
if(length(gen_record) <= 40)
HTML += "[gen_record]"
else
HTML += "[copytext(gen_record, 1, 37)]..."
HTML += "<br><a href=\"byond://?_src_=prefs;preference=records;task=sec_record\">Security Records</a><br>"
if(lentext(sec_record) <= 40)
if(length(sec_record) <= 40)
HTML += "[sec_record]<br>"
else
HTML += "[copytext(sec_record, 1, 37)]...<br>"
+5 -3
View File
@@ -527,7 +527,7 @@ BLIND // can't see anything
end up with a suffix of _open_open if adjusted twice, since their initial state is _open. */
item_state = copytext(item_state, 1, findtext(item_state, "_open"))
if(adjust_flavour)
flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button.
flavour = "[copytext(adjust_flavour, 3, length(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button.
to_chat(user, "You [flavour] \the [src].")
suit_adjusted = 0 //Suit is no longer adjusted.
for(var/X in actions)
@@ -601,13 +601,14 @@ BLIND // can't see anything
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
species_restricted = list("exclude","Vox","Wryn")
species_restricted = list("exclude","Wryn")
flash_protect = 2
strip_delay = 50
put_on_delay = 50
resistance_flags = NONE
dog_fashion = null
/obj/item/clothing/suit/space
name = "Space suit"
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
@@ -630,7 +631,8 @@ BLIND // can't see anything
put_on_delay = 80
resistance_flags = NONE
hide_tail_by_species = null
species_restricted = list("exclude","Vox","Wryn")
species_restricted = list("exclude","Wryn")
//Under clothing
/obj/item/clothing/under
+3 -1
View File
@@ -197,6 +197,7 @@
"Grey" = 'icons/mob/species/grey/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
)
@@ -210,9 +211,10 @@
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
)
hide_tail_by_species = list("Unathi, Tajaran, Vulpkanin")
hide_tail_by_species = list("Unathi, Tajaran, Vox, Vulpkanin")
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/New()
..()
@@ -229,7 +229,6 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20, fire = 50, acid = 65)
flash_protect = 0
species_restricted = list("exclude", "Wryn")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
@@ -249,8 +248,9 @@
desc = ". . ."
icon_state = "spacemimehelmet"
item_state = "spacemimehelmet"
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
species_restricted = list("exclude","Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi')
sprite_sheets_obj = null
/obj/item/clothing/suit/space/eva/mime
@@ -259,8 +259,9 @@
desc = ". . ."
icon_state = "spacemime_suit"
item_state = "spacemime_items"
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
species_restricted = list("exclude","Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi')
sprite_sheets_obj = null
/obj/item/clothing/head/helmet/space/eva/clown
@@ -269,8 +270,9 @@
desc = "An EVA helmet specifically designed for the clown. SPESSHONK!"
icon_state = "clownhelmet"
item_state = "clownhelmet"
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
species_restricted = list("exclude","Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi')
sprite_sheets_obj = null
/obj/item/clothing/suit/space/eva/clown
@@ -279,6 +281,7 @@
desc = "An EVA suit specifically designed for the clown. SPESSHONK!"
icon_state = "spaceclown_suit"
item_state = "spaceclown_items"
species_restricted = list("exclude","Vox","Wryn")
sprite_sheets = null
species_restricted = list("exclude","Wryn")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi')
sprite_sheets_obj = null
@@ -13,7 +13,7 @@
desc = "It looks pretty sciency."
icon = 'icons/obj/rig_modules.dmi'
icon_state = "module"
toolspeed = 1
var/damage = 0
@@ -155,7 +155,7 @@
to_chat(usr, "<span class='warning'>The suit is not initialized.</span>")
return 0
if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened)
if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.IsWeakened())
to_chat(usr, "<span class='warning'>You cannot use the suit in this state.</span>")
return 0
+1 -1
View File
@@ -1052,7 +1052,7 @@
if(user.restrained())
to_chat(user, "<span class='notice'>You need your hands free for this.</span>")
return 0
if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
if(user.stat || user.paralysis || user.sleeping || user.lying || user.IsWeakened())
return 0
return 1
#undef ONLY_DEPLOY
+12
View File
@@ -6,6 +6,13 @@
item_state = "syndicate"
desc = "Has a tag on it: Totally not property of a hostile corporation, honest!"
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85)
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi')
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -15,6 +22,11 @@
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85)
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi',
"Vox" = 'icons/mob/species/vox/suit.dmi')
//Green syndicate space suit
+11
View File
@@ -6,6 +6,12 @@
icon_state = "void-red"
item_state = "void"
flags_inv = HIDEMASK|HIDEEARS
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi')
/obj/item/clothing/suit/space/nasavoid
name = "NASA Void Suit"
@@ -13,6 +19,11 @@
item_state = "void"
desc = "A high tech, NASA Centcom branch designed space suit. Used for AI satellite maintenance."
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/multitool)
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi',
"Vox" = 'icons/mob/species/vox/suit.dmi')
//Colors!!!
/obj/item/clothing/head/helmet/space/nasavoid/green
+1 -1
View File
@@ -181,7 +181,7 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20, fire = 100, acid = 100)
actions_types = null //No inbuilt light
actions_types = list() //No inbuilt light
resistance_flags = FIRE_PROOF | ACID_PROOF
magical = TRUE
+6 -1
View File
@@ -8,6 +8,7 @@
CAT_MISC,
CAT_PRIMAL,
CAT_FOOD,
CAT_DECORATIONS,
CAT_CLOTHING)
var/list/subcategories = list(
list( //Weapon subcategories
@@ -20,7 +21,11 @@
CAT_CAKE,
CAT_SUSHI,
CAT_SANDWICH),
CAT_CLOTHING) //Clothing subcategories
list( //Decoration subcategories
CAT_DECORATION,
CAT_HOLIDAY,
CAT_LARGE_DECORATIONS),
CAT_CLOTHING) //Clothing subcategories
var/display_craftable_only = FALSE
var/display_compact = TRUE
+445
View File
@@ -571,3 +571,448 @@
time = 50
category = CAT_MISC
always_availible = FALSE
/datum/crafting_recipe/paper_craft
name = "Paper Heart"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/heart
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 1)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)//cutters act as makeshift scissors. I doubt the barber wants to have their scissors stolen when somone wants to decorate
category = CAT_DECORATIONS
subcategory = CAT_DECORATION
/datum/crafting_recipe/paper_craft/single_eye
name = "Paper Eye"
result = /obj/item/decorations/sticky_decorations/flammable/singleeye
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/blue)
category = CAT_DECORATIONS
subcategory = CAT_DECORATION
/datum/crafting_recipe/paper_craft/googlyeyes
name = "Paper Googly Eye"
result = /obj/item/decorations/sticky_decorations/flammable/googlyeyes
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_DECORATION
/datum/crafting_recipe/paper_craft/clock
name = "Paper Clock"
result = /obj/item/decorations/sticky_decorations/flammable/paperclock
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_DECORATION
/datum/crafting_recipe/paper_craft/jack_o_lantern
name = "Paper Jack o'Lantern"
result = /obj/item/decorations/sticky_decorations/flammable/jack_o_lantern
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/orange,
/obj/item/toy/crayon/green)//pen ink is black
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/ghost
name = "Paper Ghost"
result = /obj/item/decorations/sticky_decorations/flammable/ghost
tools = list(/obj/item/wirecutters,
/obj/item/pen)//it's white paper why need a white crayon?
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/spider
name = "Paper Spider"
result = /obj/item/decorations/sticky_decorations/flammable/spider
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/spiderweb
name = "Paper Spiderweb"
result = /obj/item/decorations/sticky_decorations/flammable/spiderweb
tools = list(/obj/item/wirecutters)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/skull
name = "Paper Skull"
result = /obj/item/decorations/sticky_decorations/flammable/skull
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/skeleton
name = "Paper Skeleton"
result = /obj/item/decorations/sticky_decorations/flammable/skeleton
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/cauldron
name = "Paper Cauldron"
result = /obj/item/decorations/sticky_decorations/flammable/cauldron
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/snowman
name = "Paper Snowman"
result = /obj/item/decorations/sticky_decorations/flammable/snowman
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/orange)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/christmas_stocking
name = "Paper Christmas Stocking"
result = /obj/item/decorations/sticky_decorations/flammable/christmas_stocking
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/christmas_tree
name = "Paper Christmas Tree"
result = /obj/item/decorations/sticky_decorations/flammable/christmas_tree
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red,
/obj/item/toy/crayon/yellow,
/obj/item/toy/crayon/blue,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/snowflake
name = "Paper Snowflake"
result = /obj/item/decorations/sticky_decorations/flammable/snowflake
tools = list(/obj/item/wirecutters)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/candy_cane
name = "Paper Candy Cane"
result = /obj/item/decorations/sticky_decorations/flammable/candy_cane
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/mistletoe
name = "Paper Mistletoe"
result = /obj/item/decorations/sticky_decorations/flammable/mistletoe
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/holly
name = "Paper Holly"
result = /obj/item/decorations/sticky_decorations/flammable/holly
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_white
name = "Paper Tinsel White"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_red
name = "Red Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/red
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_blue
name = "Blue Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/blue
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/blue)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_yellow
name = "Yellow Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/yellow
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/yellow)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_purple
name = "Purple Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/purple
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/purple)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_green
name = "Green Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/green
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_orange
name = "Orange Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/orange
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/orange)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_black
name = "Black Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/black
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/pen)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/tinsel_halloween
name = "Halloween style Paper Tinsel"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/tinsel/halloween
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2)
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/orange)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/arrowed_heart
name = "Paper Arrowed Heart"
result = /obj/item/decorations/sticky_decorations/flammable/arrowed_heart
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/heart_chain
name = "Paper Heart Chain"
result = /obj/item/decorations/sticky_decorations/flammable/heart_chain
reqs = list(/obj/item/paper = 1,
/obj/item/stack/tape_roll = 2,
/obj/item/stack/cable_coil = 2)
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/four_leaf_clover
name = "Paper Four Leaf Clover"
result = /obj/item/decorations/sticky_decorations/flammable/four_leaf_clover
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/pot_of_gold
name = "Paper Pot of Gold"
result = /obj/item/decorations/sticky_decorations/flammable/pot_of_gold
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/red,
/obj/item/toy/crayon/yellow,
/obj/item/toy/crayon/orange,
/obj/item/toy/crayon/green,
/obj/item/toy/crayon/blue,
/obj/item/toy/crayon/purple)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/leprechaun_hat
name = "Paper Leprechaun Hat"
time = 10
result = /obj/item/decorations/sticky_decorations/flammable/leprechaun_hat
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/yellow,
/obj/item/toy/crayon/green)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_bunny
name = "Paper Easter Bunny"
result = /obj/item/decorations/sticky_decorations/flammable/easter_bunny
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/toy/crayon/blue,
/obj/item/toy/crayon/purple)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_egg_blue
name = "Blue Paper Easter Egg"
result = /obj/item/decorations/sticky_decorations/flammable/easter_egg
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/blue)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_egg_yellow
name = "Yellow Paper Easter Egg"
result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/yellow
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/yellow)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_egg_red
name = "Red Paper Easter Egg"
result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/red
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_egg_purple
name = "Purple Paper Easter Egg"
result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/purple
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/purple)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/paper_craft/easter_egg_orange
name = "Orange Paper Easter Egg"
result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/orange
tools = list(/obj/item/wirecutters,
/obj/item/toy/crayon/orange)
category = CAT_DECORATIONS
subcategory = CAT_HOLIDAY
/datum/crafting_recipe/metal_angel_statue
name = "Metal angel statue"
time = 50
result = /obj/structure/decorative_structures/metal/statue/metal_angel
reqs = list(/obj/item/stack/sheet/metal = 10,
/obj/item/stack/sheet/mineral/gold = 6)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/golden_disk_statue
name = "Golden disk statue"
time = 50
result = /obj/structure/decorative_structures/metal/statue/golden_disk
reqs = list(/obj/item/stack/sheet/metal = 10,
/obj/item/stack/sheet/mineral/plasma = 3,
/obj/item/stack/sheet/mineral/gold = 8)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/sun_statue
name = "Sun statue"
time = 40
result = /obj/structure/decorative_structures/metal/statue/sun
reqs = list(/obj/item/stack/sheet/metal = 6,
/obj/item/stack/sheet/mineral/gold = 4)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/moon_statue
name = "Moon statue"
time = 50
result = /obj/structure/decorative_structures/metal/statue/moon
reqs = list(/obj/item/stack/sheet/metal = 6,
/obj/item/stack/sheet/mineral/silver = 6,
/obj/item/stack/sheet/mineral/gold = 4)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/tesla_statue
name = "Tesla statue"
time = 40
result = /obj/structure/decorative_structures/metal/statue/tesla
reqs = list(/obj/item/stack/sheet/metal = 4,
/obj/item/stack/sheet/glass = 8)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/tesla_monument
name = "Tesla monument"
time = 50
result = /obj/structure/decorative_structures/metal/statue/tesla_monument
reqs = list(/obj/item/stack/sheet/metal = 8,
/obj/item/stock_parts/cell = 3,
/obj/item/stack/cable_coil = 4)
tools = list(/obj/item/weldingtool)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/grandfather_clock
name = "Grandfather clock"
time = 50
result = /obj/structure/decorative_structures/flammable/grandfather_clock
reqs = list(/obj/item/stack/sheet/wood = 5,
/obj/item/stack/sheet/mineral/gold = 1,
/obj/item/stack/sheet/glass = 2)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
/datum/crafting_recipe/lava_land_display
name = "Lava land display"
time = 50
result = /obj/structure/decorative_structures/flammable/lava_land_display
reqs = list(/obj/item/paper = 4,
/obj/item/stack/sheet/wood = 4,
/obj/item/stack/rods = 4,
/obj/item/stock_parts/cell = 1,
/obj/item/stack/cable_coil = 4)//thing is a wireframe construct with an electro magnetic hover field
tools = list(/obj/item/wirecutters,
/obj/item/pen,
/obj/item/weldingtool,
/obj/item/toy/crayon/red)
category = CAT_DECORATIONS
subcategory = CAT_LARGE_DECORATIONS
+5
View File
@@ -1,6 +1,8 @@
/datum/event/alien_infestation
announceWhen = 400
var/highpop_trigger = 80
var/spawncount = 2
var/list/playercount
var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
/datum/event/alien_infestation/setup()
@@ -12,6 +14,9 @@
/datum/event/alien_infestation/start()
var/list/vents = list()
playercount = length(GLOB.clients)//grab playercount when event starts not when game starts
if(playercount >= highpop_trigger) //spawn with 4 if highpop
spawncount = 4
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology
+4 -3
View File
@@ -181,7 +181,8 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), 1)
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Headcrabs", /datum/event/headcrabs, 0, list(ASSIGNMENT_SECURITY = 20))
)
/datum/event_container/major
@@ -196,8 +197,8 @@ var/list/event_last_fired = list()
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 180, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Floor Cluwne", /datum/event/spawn_floor_cluwne, 15, is_one_shot = 1)
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Floor Cluwne", /datum/event/spawn_floor_cluwne, 15, is_one_shot = 1)
)
+18 -119
View File
@@ -1,114 +1,29 @@
#define LOC_ATMOS_CONTROL 0
#define LOC_FPMAINT 1
#define LOC_FPMAINT2 2
#define LOC_FSMAINT 3
#define LOC_FSMAINT2 4
#define LOC_ASMAINT 5
#define LOC_ASMAINT2 6
#define LOC_APMAINT 7
#define LOC_MAINTCENTRAL 8
#define LOC_FORE 9
#define LOC_STARBOARD 10
#define LOC_PORT 11
#define LOC_AFT 12
#define LOC_STORAGE 13
#define LOC_DISPOSAL 14
#define LOC_GENETICS 15
#define LOC_ELECTRICAL 16
#define LOC_ABANDONEDBAR 17
#define LOC_ELECTRICAL_SHOP 18
#define LOC_GAMBLING_DEN 19
#define HEADCRAB_NORMAL 0
#define HEADCRAB_FASTMIX 1
#define HEADCRAB_FAST 2
#define HEADCRAB_POISONMIX 3
#define HEADCRAB_POISON 4
/*#define HEADCRAB_CLOWN 5 */ //Planned for the future. maybe
#define HEADCRAB_SPAWNER 5
/datum/event/headcrabs
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/headcrab
var/headcrab_type
/datum/event/headcrabs/start()
location = rand(0,19)
var/list/availableareas = list()
for(var/area/maintenance/A in world)
availableareas += A
var/area/randomarea = pick(availableareas)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_ATMOS_CONTROL)
spawn_area_type = /area/maintenance/atmos_control
locstring = "Atmospherics Maintenance"
if(LOC_FPMAINT)
spawn_area_type = /area/maintenance/fpmaint
locstring = "EVA Maintenance"
if(LOC_FPMAINT2)
spawn_area_type = /area/maintenance/fpmaint2
locstring = "Arrivals North Maintenance"
if(LOC_FSMAINT)
spawn_area_type = /area/maintenance/fsmaint
locstring = "Dormitory Maintenance"
if(LOC_FSMAINT2)
spawn_area_type = /area/maintenance/fsmaint2
locstring = "Bar Maintenance"
if(LOC_ASMAINT)
spawn_area_type = /area/maintenance/asmaint
locstring = "Medbay Maintenance"
if(LOC_ASMAINT2)
spawn_area_type = /area/maintenance/asmaint2
locstring = "Science Maintenance"
if(LOC_APMAINT)
spawn_area_type = /area/maintenance/apmaint
locstring = "Cargo Maintenance"
if(LOC_MAINTCENTRAL)
spawn_area_type = /area/maintenance/maintcentral
locstring = "Bridge Maintenance"
if(LOC_FORE)
spawn_area_type = /area/maintenance/fore
locstring = "Fore Maintenance"
if(LOC_STARBOARD)
spawn_area_type = /area/maintenance/starboard
locstring = "Starboard Maintenance"
if(LOC_PORT)
spawn_area_type = /area/maintenance/port
locstring = "Locker Room Maintenance"
if(LOC_AFT)
spawn_area_type = /area/maintenance/aft
locstring = "Engineering Maintenance"
if(LOC_STORAGE)
spawn_area_type = /area/maintenance/storage
locstring = "Atmospherics Maintenance"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "Waste Disposal"
if(LOC_GENETICS)
spawn_area_type = /area/maintenance/genetics
locstring = "Genetics Maintenance"
if(LOC_ELECTRICAL)
spawn_area_type = /area/maintenance/electrical
locstring = "Electrical Maintenance"
if(LOC_ABANDONEDBAR)
spawn_area_type = /area/maintenance/abandonedbar
locstring = "Maintenance Bar"
if(LOC_ELECTRICAL_SHOP)
spawn_area_type = /area/maintenance/electrical_shop
locstring ="Electronics Den"
if(LOC_GAMBLING_DEN)
spawn_area_type = /area/maintenance/gambling_den
locstring = "Gambling Den"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
if(turf_clear(F))
turfs += F
for(var/turf/simulated/floor/F in randomarea)
if(turf_clear(F))
turfs += F
var/list/spawn_types = list()
var/max_number
headcrab = rand(0, 4) //rand(0,x) for the future
switch(headcrab) //Switch is for the future
headcrab_type = rand(0, 5)
switch(headcrab_type)
if(HEADCRAB_NORMAL)
spawn_types = list(/mob/living/simple_animal/hostile/headcrab)
max_number = 6
@@ -124,9 +39,13 @@
if(HEADCRAB_POISON)
spawn_types = list(/mob/living/simple_animal/hostile/headcrab/poison)
max_number = 3
if(HEADCRAB_SPAWNER)
spawn_types = list(/obj/structure/spawner/headcrab)
max_number = 2
var/num = rand(2,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
@@ -136,31 +55,11 @@
/datum/event/headcrabs/announce()
event_announcement.Announce("Bioscans indicate that creatures have been breeding in [locstring]. Clear them out, before this starts to affect productivity", "Lifesign Alert")
#undef LOC_ATMOS_CONTROL
#undef LOC_FPMAINT
#undef LOC_FPMAINT2
#undef LOC_FSMAINT
#undef LOC_FSMAINT2
#undef LOC_ASMAINT
#undef LOC_ASMAINT2
#undef LOC_APMAINT
#undef LOC_MAINTCENTRAL
#undef LOC_FORE
#undef LOC_STARBOARD
#undef LOC_PORT
#undef LOC_AFT
#undef LOC_STORAGE
#undef LOC_DISPOSAL
#undef LOC_GENETICS
#undef LOC_ELECTRICAL
#undef LOC_ABANDONEDBAR
#undef LOC_ELECTRICAL_SHOP
#undef LOC_GAMBLING_DEN
event_announcement.Announce("Bioscans indicate that headcrabs have been breeding on the station. Clear them out, before this starts to affect productivity", "Lifesign Alert")
#undef HEADCRAB_NORMAL
#undef HEADCRAB_FASTMIX
#undef HEADCRAB_FAST
#undef HEADCRAB_POISONMIX
#undef HEADCRAB_POISON
#undef HEADCRAB_POISON
#undef HEADCRAB_SPAWNER
+3 -4
View File
@@ -36,9 +36,9 @@
SA.universal_speak = 1
SA.sentience_act()
SA.can_collar = 1
SA.maxHealth = max(SA.maxHealth + 200)
SA.melee_damage_lower = max(SA.melee_damage_lower + 15)
SA.melee_damage_upper = max(SA.melee_damage_upper + 15)
SA.maxHealth += 200
SA.melee_damage_lower += 15
SA.melee_damage_upper += 15
SA.health = SA.maxHealth
SA.del_on_death = FALSE
greet_sentient(SA)
@@ -50,4 +50,3 @@
to_chat(M, "<span class='warning'>Due to freak radiation, you have gained \
human level intelligence and the ability to speak and understand \
human language!</span>")
+2 -2
View File
@@ -1,7 +1,7 @@
proc/Intoxicated(phrase)
phrase = html_decode(phrase)
var/leng=lentext(phrase)
var/counter=lentext(phrase)
var/leng=length(phrase)
var/counter=length(phrase)
var/newphrase=""
var/newletter=""
while(counter>=1)
@@ -286,7 +286,7 @@
if(faction)
creature.faction = faction
if(LAZYLEN(fingerprintshidden))
creature.fingerprintshidden = fingerprintshidden.Copy()
creature.fingerprintshidden = fingerprintshidden
creature.set_species(monkey_type)
SSmobs.cubemonkeys += creature
qdel(src)
+2 -2
View File
@@ -25,7 +25,7 @@
else
log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
QDEL_IN(src, 1)
qdel(src)
return
///Check if the key is short enough to even be a real key
@@ -33,7 +33,7 @@
to_chat(src, "<span class='userdanger'>Invalid KeyDown detected! You have been disconnected from the server automatically.</span>")
log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
QDEL_IN(src, 1)
qdel(src)
return
//offset by 1 because the buffer address is 0 indexed because the math was simpler
keys_held[current_key_address + 1] = _key
+6 -6
View File
@@ -53,7 +53,7 @@
/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(!D.weakened && !D.resting && !D.lying)
if(!D.IsWeakened() && !D.resting && !D.lying)
D.visible_message("<span class='warning'>[A] slams [D] into the ground!</span>", \
"<span class='userdanger'>[A] slams you into the ground!</span>")
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
@@ -70,7 +70,7 @@
if(!can_use(A))
return FALSE
var/success = FALSE
if(!D.stat || !D.weakened)
if(!D.stat || !D.IsWeakened())
D.visible_message("<span class='warning'>[A] kicks [D] back!</span>", \
"<span class='userdanger'>[A] kicks you back!</span>")
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
@@ -79,7 +79,7 @@
D.apply_damage(10, BRUTE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL)
success = TRUE
if(D.weakened && !D.stat)
if(D.IsWeakened() && !D.stat)
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
@@ -164,7 +164,7 @@
A.do_attack_animation(D)
var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched", "Big Bossed")
var/bonus_damage = 13
if(D.weakened || D.resting || D.lying)
if(D.IsWeakened() || D.resting || D.lying)
bonus_damage += 5
picked_hit_type = "stomps on"
D.apply_damage(bonus_damage, BRUTE)
@@ -175,7 +175,7 @@
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
add_attack_logs(A, D, "Melee attacked with martial-art [src] : [picked_hit_type]", ATKLOG_ALL)
if(A.resting && !D.stat && !D.weakened)
if(A.resting && !D.stat && !D.IsWeakened())
D.visible_message("<span class='warning'>[A] leg sweeps [D]!", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
@@ -204,7 +204,7 @@
restraining = FALSE
if(prob(65))
if(!D.stat || !D.weakened || !restraining)
if(!D.stat || !D.IsWeakened() || !restraining)
I = D.get_active_hand()
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
+2 -2
View File
@@ -75,7 +75,7 @@
return 0
/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.stat || D.weakened)
if(D.stat || D.IsWeakened())
return 0
D.visible_message("<span class='warning'>[A] leg sweeps [D]!</span>", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
@@ -111,7 +111,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
add_attack_logs(A, D, "Melee attacked with [src]")
var/picked_hit_type = pick("punches", "kicks")
var/bonus_damage = 10
if(D.weakened || D.resting || D.lying)
if(D.IsWeakened() || D.resting || D.lying)
bonus_damage += 5
picked_hit_type = "stomps on"
D.apply_damage(bonus_damage, BRUTE)
+2 -2
View File
@@ -22,7 +22,7 @@
return 0
/datum/martial_art/mimejutsu/proc/mimeChuck(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -54,7 +54,7 @@
return basic_hit(A,D)
/datum/martial_art/mimejutsu/proc/mimePalm(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
D.visible_message("<span class='danger'>[A] has barely touched [D] with [A.p_their()] palm!</span>", \
"<span class='userdanger'>[A] hovers [A.p_their()] palm over your face!</span>")
+5 -5
View File
@@ -35,7 +35,7 @@
return 0
/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("<span class='warning'>[A] grabs [D]'s wrist and wrenches it sideways!</span>", \
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
@@ -50,7 +50,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(A.dir == D.dir && !D.stat && !D.weakened)
if(A.dir == D.dir && !D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
@@ -63,7 +63,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
if(!D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] knees [D] in the stomach!</span>", \
"<span class='userdanger'>[A] winds you with a knee in the stomach!</span>")
@@ -77,7 +77,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
if(!D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
@@ -91,7 +91,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.weakened || D.resting || D.stat)
if(D.IsWeakened() || D.resting || D.stat)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("<span class='warning'>[A] elbow drops [D]!</span>", \
"<span class='userdanger'>[A] piledrives you with [A.p_their()] elbow!</span>")
@@ -80,7 +80,7 @@
flags = PREVENT_CLICK_UNDER
reinf = TRUE
heat_resistance = 1600
armor = list("melee" = 90, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
smooth = SMOOTH_MORE
canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
explosion_block = 3
+1 -1
View File
@@ -162,7 +162,7 @@
if(copytext(heardword,1, 1) in punctuation)
heardword = copytext(heardword,2)
if(copytext(heardword,-1) in punctuation)
heardword = copytext(heardword,1,lentext(heardword))
heardword = copytext(heardword,1,length(heardword))
heard = "<span class='game say'>...<i>You hear something about<i>... '[heardword]'...</span>"
else
heard = "<span class='game say'>...<i>You almost hear something...</i>...</span>"
@@ -25,7 +25,7 @@
icon_state = "alien[caste]_dead"
pixel_y = 0
else if(stat == UNCONSCIOUS || weakened)
else if(stat == UNCONSCIOUS || IsWeakened())
icon_state = "alien[caste]_unconscious"
pixel_y = 0
else if(leap_on_click)
+7 -4
View File
@@ -774,11 +774,14 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
spawn(0)
resist_muzzle()
if(restrained())
var/obj/item/I = handcuffed
var/breakouttime = I.breakouttime
var/displaytime = breakouttime / 10
changeNext_move(CLICK_CD_BREAKOUT)
last_special = world.time + CLICK_CD_BREAKOUT
visible_message("<span class='warning'>[src] attempts to unbuckle [p_them()]self!</span>", \
"<span class='notice'>You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)</span>")
if(do_after(src, 600, 0, target = src))
"<span class='notice'>You attempt to unbuckle yourself... (This will take around [displaytime] seconds and you need to stay still.)</span>")
if(do_after(src, breakouttime, 0, target = src))
if(!buckled)
return
buckled.user_unbuckle_mob(src,src)
@@ -836,10 +839,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
breakouttime = I.breakouttime
var/displaytime = breakouttime / 600
var/displaytime = breakouttime / 10
if(!cuff_break)
visible_message("<span class='warning'>[src] attempts to remove [I]!</span>")
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)</span>")
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [displaytime] seconds and you need to stand still.)</span>")
if(do_after(src, breakouttime, 0, target = src))
if(I.loc != src || buckled)
return
@@ -383,7 +383,7 @@
message = "<B>[src]</B> flips in [M]'s general direction."
SpinAnimation(5,1)
else
if(lying || weakened)
if(lying || IsWeakened())
message = "<B>[src]</B> flops and flails around on the floor."
else
var/obj/item/grab/G
@@ -215,6 +215,12 @@
else if(E.status & ORGAN_SPLINTED)
wound_flavor_text["[E.limb_name]"] = "[p_they(TRUE)] [p_have()] a splint on [p_their()] [E.name]!\n"
if(E.open)
if(E.is_robotic())
msg += "<b>The maintenance hatch on [p_their()] [ignore_limb_branding(E.limb_name)] is open!</b>\n"
else
msg += "<b>[p_their(TRUE)] [ignore_limb_branding(E.limb_name)] has an open incision!</b>\n"
for(var/obj/item/I in E.embedded_objects)
msg += "<B>[p_they(TRUE)] [p_have()] \a [bicon(I)] [I] embedded in [p_their()] [E.name]!</B>\n"
@@ -370,7 +376,7 @@
msg += "*---------*</span>"
if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\n[p_they(TRUE)] [p_are()] [pose]"
@@ -403,3 +409,29 @@
return 0
else
return 0
// Ignores robotic limb branding prefixes like "Morpheus Cybernetics"
/proc/ignore_limb_branding(limb_name)
switch(limb_name)
if("chest")
. = "upper body"
if("groin")
. = "lower body"
if("head")
. = "head"
if("l_arm")
. = "left arm"
if("r_arm")
. = "right arm"
if("l_leg")
. = "left leg"
if("r_leg")
. = "right leg"
if("l_foot")
. = "left foot"
if("r_foot")
. = "right foot"
if("l_hand")
. = "left hand"
if("r_hand")
. = "right hand"
@@ -22,7 +22,7 @@
med_hud_set_status()
handle_hud_icons_health()
/mob/living/carbon/human/adjustBrainLoss(amount, updating = TRUE)
/mob/living/carbon/human/adjustBrainLoss(amount, updating = TRUE, use_brain_mod = TRUE)
if(status_flags & GODMODE)
return STATUS_UPDATE_NONE //godmode
@@ -30,7 +30,8 @@
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
if(dna.species && amount > 0)
amount = amount * dna.species.brain_mod
if(use_brain_mod)
amount = amount * dna.species.brain_mod
sponge.damage = Clamp(sponge.damage + amount, 0, 120)
if(sponge.damage >= 120)
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
@@ -39,7 +40,7 @@
update_stat("adjustBrainLoss")
return STATUS_UPDATE_STAT
/mob/living/carbon/human/setBrainLoss(amount, updating = TRUE)
/mob/living/carbon/human/setBrainLoss(amount, updating = TRUE, use_brain_mod = TRUE)
if(status_flags & GODMODE)
return STATUS_UPDATE_NONE //godmode
@@ -47,7 +48,8 @@
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
if(dna.species && amount > 0)
amount = amount * dna.species.brain_mod
if(use_brain_mod)
amount = amount * dna.species.brain_mod
sponge.damage = Clamp(amount, 0, 120)
if(sponge.damage >= 120)
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
@@ -16,20 +16,8 @@ emp_act
if(check_reflect(def_zone)) // Checks if you've passed a reflection% check
visible_message("<span class='danger'>The [P.name] gets reflected by [src]!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]!</span>")
// Find a turf near or on the original location to bounce to
if(P.starting)
var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
var/turf/curloc = get_turf(src)
// redirect the projectile
P.firer = src
P.original = locate(new_x, new_y, P.z)
P.starting = curloc
P.current = curloc
P.yo = new_y - curloc.y
P.xo = new_x - curloc.x
P.Angle = null
P.reflect_back(src)
return -1 // complete projectile permutation
@@ -633,7 +621,7 @@ emp_act
if("brute")
if(M.force > 35) // durand and other heavy mechas
Paralyse(1)
else if(M.force > 20 && !weakened) // lightweight mechas like gygax
else if(M.force > 20 && !IsWeakened()) // lightweight mechas like gygax
Weaken(2)
update |= affecting.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE)
@@ -246,7 +246,7 @@
if(H.r_hand && (H.r_hand.flags & HANDSLOW))
. += H.r_hand.slowdown
var/health_deficiency = (H.maxHealth - H.health + H.staminaloss)
var/health_deficiency = max(H.maxHealth - H.health, H.staminaloss)
var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80
if(H.reagents)
for(var/datum/reagent/R in H.reagents.reagent_list)
@@ -751,7 +751,7 @@
return FALSE //Unsupported slot
/datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H)
return H.health - H.getStaminaLoss()
return min(H.health, H.maxHealth - H.getStaminaLoss())
/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
if(!H.client)
@@ -474,19 +474,9 @@
if(P.is_reflectable)
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [H]'s glass skin!</span>")
if(P.starting)
var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
var/turf/curloc = get_turf(H)
P.reflect_back(H)
// redirect the projectile
P.firer = src
P.original = locate(new_x, new_y, P.z)
P.starting = curloc
P.current = curloc
P.yo = new_y - curloc.y
P.xo = new_x - curloc.x
P.Angle = null
return FALSE
return TRUE
@@ -131,6 +131,13 @@
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/skrell //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
)
/datum/species/monkey/skrell/on_species_gain(mob/living/carbon/human/H)
..()
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/monkey/skrell/on_species_loss(mob/living/carbon/human/H)
..()
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/monkey/unathi
name = "Stok"
@@ -12,6 +12,7 @@
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
the secrets of their empire to their allies."
species_traits = list(LIPS)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
@@ -43,4 +44,12 @@
"is jamming their thumbs into their eye sockets!",
"is twisting their own neck!",
"makes like a fish and suffocates!",
"is strangling themselves with their own tendrils!")
"is strangling themselves with their own tendrils!")
/datum/species/skrell/on_species_gain(mob/living/carbon/human/H)
..()
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/skrell/on_species_loss(mob/living/carbon/human/H)
..()
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
@@ -72,6 +72,7 @@
grow.Grant(H)
recolor = new()
recolor.Grant(H)
ADD_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/slime/on_species_loss(mob/living/carbon/human/H)
..()
@@ -79,6 +80,7 @@
grow.Remove(H)
if(recolor)
recolor.Remove(H)
REMOVE_TRAIT(H, TRAIT_WATERBREATH, "species")
/datum/species/slime/handle_life(mob/living/carbon/human/H)
// Slowly shifting to the color of the reagents
+4 -2
View File
@@ -258,8 +258,10 @@
//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
/mob/living/carbon/handle_status_effects()
..()
setStaminaLoss(max((staminaloss - 3), 0))
if(stam_regen_start_time <= world.time)
if(stam_paralyzed)
update_stamina()
setStaminaLoss(0, FALSE)
var/restingpwr = 1 + 4 * resting
@@ -0,0 +1,15 @@
/mob/living/carbon/IsWeakened(include_stamcrit = TRUE)
return ..() || (include_stamcrit && stam_paralyzed)
/mob/living/carbon/proc/enter_stamcrit()
if(!(status_flags & CANWEAKEN))
return
if(absorb_stun(0)) //continuous effect, so we don't want it to increment the stuns absorbed.
return
if(!IsWeakened())
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
var/prev = stam_paralyzed
stam_paralyzed = TRUE
update_canmove()
if(!prev && getStaminaLoss() < 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems.
adjustStaminaLoss(30, FALSE)
@@ -18,15 +18,13 @@
create_debug_log("woke up, trigger reason: [reason]")
/mob/living/carbon/update_stamina()
..()
if(staminaloss)
var/total_health = (health - staminaloss)
if(total_health <= HEALTH_THRESHOLD_CRIT && !stat)
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
Weaken(5)
setStaminaLoss(health - 2)
handle_hud_icons_health()
return
var/stam = getStaminaLoss()
if(stam > DAMAGE_PRECISION && (maxHealth - stam) <= HEALTH_THRESHOLD_CRIT && !stat)
enter_stamcrit()
else if(stam_paralyzed)
stam_paralyzed = FALSE
update_canmove()
handle_hud_icons_health()
/mob/living/carbon/can_hear()
. = FALSE
+6 -4
View File
@@ -260,28 +260,30 @@
if(status_flags & GODMODE)
return FALSE
var/old_stamloss = staminaloss
staminaloss = max(staminaloss + amount, 0)
staminaloss = min(max(staminaloss + amount, 0), 120)
if(old_stamloss == staminaloss)
updating = FALSE
. = STATUS_UPDATE_NONE
else
. = STATUS_UPDATE_STAMINA
if(amount > 0)
stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME
if(updating)
handle_hud_icons_health()
update_stamina()
/mob/living/proc/setStaminaLoss(amount, updating = TRUE)
if(status_flags & GODMODE)
return FALSE
var/old_stamloss = staminaloss
staminaloss = amount
staminaloss = min(max(amount, 0), 120)
if(old_stamloss == staminaloss)
updating = FALSE
. = STATUS_UPDATE_NONE
else
. = STATUS_UPDATE_STAMINA
if(amount > 0)
stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME
if(updating)
handle_hud_icons_health()
update_stamina()
/mob/living/proc/getMaxHealth()
@@ -69,3 +69,5 @@
var/deathgasp_on_death = FALSE
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
var/stam_regen_start_time = 0 //used to halt stamina regen temporarily
var/stam_paralyzed = FALSE //knocks you down
+2 -1
View File
@@ -129,7 +129,8 @@ var/const/VOX_PATH = "sound/vox_fem/"
announcing_vox = world.time + VOX_DELAY
log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].")
log_game("[key_name(src)] made a vocal announcement: [message].")
message_admins("[key_name_admin(src)] made a vocal announcement: [message].")
for(var/word in words)
play_vox_word(word, src.z, null)
+3 -3
View File
@@ -318,7 +318,7 @@
set category = "pAI Commands"
set name = "Unfold Chassis"
if(stat || sleeping || paralysis || weakened)
if(stat || sleeping || paralysis || IsWeakened())
return
if(loc != card)
@@ -353,7 +353,7 @@
set category = "pAI Commands"
set name = "Collapse Chassis"
if(stat || sleeping || paralysis || weakened)
if(stat || sleeping || paralysis || IsWeakened())
return
if(loc == card)
@@ -538,7 +538,7 @@
if(print_flavor_text()) msg += "\n[print_flavor_text()]"
if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
msg += "\n*---------*</span>"
@@ -52,8 +52,7 @@
camera.network.Add("Engineering")
//They are unable to be upgraded, so let's give them a bit of a better battery.
cell.maxcharge = 10000
cell.charge = 10000
cell = new /obj/item/stock_parts/cell/high(src)
// NO BRAIN.
mmi = null
@@ -50,7 +50,7 @@
if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
@@ -169,7 +169,7 @@
weaponlock_time = 120
/mob/living/silicon/robot/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || buckled || lockcharge || stat)
if(paralysis || stunned || IsWeakened() || buckled || lockcharge || stat)
canmove = 0
else
canmove = 1
@@ -151,9 +151,7 @@ var/list/robot_verbs_default = list(
C.wrapped = new C.external_type
if(!cell)
cell = new /obj/item/stock_parts/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
cell = new /obj/item/stock_parts/cell/high(src)
..()
@@ -906,7 +904,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/update_icons()
overlays.Cut()
if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned.
if(stat != DEAD && !(paralysis || stunned || IsWeakened() || low_power_mode)) //Not dead, not stunned.
if(custom_panel in custom_eye_names)
overlays += "eyes-[custom_panel]"
else
@@ -1316,8 +1314,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/deathsquad/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
cell = new /obj/item/stock_parts/cell/hyper(src)
/mob/living/silicon/robot/deathsquad/init()
laws = new /datum/ai_laws/deathsquad
@@ -1370,8 +1367,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/ert/New(loc, cyborg_unlock)
..(loc)
cell.maxcharge = 25000
cell.charge = 25000
cell = new /obj/item/stock_parts/cell/hyper(src)
var/rnum = rand(1,1000)
var/borgname = "ERT [rnum]"
name = borgname
@@ -17,8 +17,7 @@
/mob/living/silicon/robot/syndicate/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
cell = new /obj/item/stock_parts/cell/hyper(src)
/mob/living/silicon/robot/syndicate/init()
laws = new /datum/ai_laws/syndicate_override
@@ -1,6 +1,6 @@
// No args for restraints because robots don't have those
/mob/living/silicon/robot/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
if(stat || lockcharge || IsWeakened() || stunned || paralysis || !is_component_functioning("actuator"))
return TRUE
/mob/living/silicon/robot/has_vision(information_only = FALSE)
@@ -14,7 +14,7 @@
death()
create_debug_log("died of damage, trigger reason: [reason]")
return
if(!is_component_functioning("actuator") || !is_component_functioning("power cell") || paralysis || sleeping || resting || stunned || weakened || getOxyLoss() > maxHealth * 0.5)
if(!is_component_functioning("actuator") || !is_component_functioning("power cell") || paralysis || sleeping || resting || stunned || IsWeakened() || getOxyLoss() > maxHealth * 0.5)
if(stat == CONSCIOUS)
KnockOut()
create_debug_log("fell unconscious, trigger reason: [reason]")
@@ -384,15 +384,15 @@
if(!lasercolor)
var/obj/item/gun/energy/gun/advtaser/G = new /obj/item/gun/energy/gun/advtaser(Tsec)
G.power_supply.charge = 0
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "b")
var/obj/item/gun/energy/laser/tag/blue/G = new /obj/item/gun/energy/laser/tag/blue(Tsec)
G.power_supply.charge = 0
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "r")
var/obj/item/gun/energy/laser/tag/red/G = new /obj/item/gun/energy/laser/tag/red(Tsec)
G.power_supply.charge = 0
G.cell.charge = 0
G.update_icon()
if(prob(50))
@@ -59,9 +59,7 @@
var/datum/job/cargo_tech/J = new/datum/job/cargo_tech
access_card.access = J.get_access()
prev_access = access_card.access
cell = new(src)
cell.charge = 2000
cell.maxcharge = 2000
cell = new /obj/item/stock_parts/cell/upgraded(src)
mulebot_count++
set_suffix(suffix ? suffix : "#[mulebot_count]")
@@ -47,6 +47,10 @@
if(SSticker.cultdat?.theme == "blood")
updateglow()
/mob/living/simple_animal/hostile/construct/death(gibbed)
. = ..()
SSticker.mode.remove_cultist(src.mind, FALSE)
/mob/living/simple_animal/hostile/construct/examine(mob/user)
. = ..()
@@ -132,19 +136,7 @@
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
// Find a turf near or on the original location to bounce to
if(P.starting)
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/turf/curloc = get_turf(src)
// redirect the projectile
P.original = locate(new_x, new_y, P.z)
P.starting = curloc
P.current = curloc
P.firer = src
P.yo = new_y - curloc.y
P.xo = new_x - curloc.x
P.reflect_back(src, list(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3))
return -1 // complete projectile permutation
@@ -37,7 +37,7 @@
playsound(src, yelp_sound, 75, TRUE)
/mob/living/simple_animal/pet/dog/emote(act, m_type = 1, message = null, force)
if(!incapacitated())
if(incapacitated())
return
var/on_CD = 0
@@ -5,8 +5,9 @@
icon_state = "headcrab"
icon_living = "headcrab"
icon_dead = "headcrab_dead"
health = 40
maxHealth = 40
health = 60
maxHealth = 60
dodging = 1
melee_damage_lower = 5
melee_damage_upper = 10
ranged = 1
@@ -18,7 +19,8 @@
attack_sound = 'sound/creatures/headcrab_attack.ogg'
speak_emote = list("hisses")
var/is_zombie = 0
stat_attack = DEAD //so they continue to attack when they are on the ground.
stat_attack = DEAD // Necessary for them to attack (zombify) dead humans
robust_searching = 1
var/host_species = ""
var/list/human_overlays = list()
@@ -28,6 +30,17 @@
if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
Zombify(H)
break
var/cycles = 4
if(cycles >= 4)
for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
visible_message("<span class='danger'>[src] consumes [target] whole!</span>")
if(health < maxHealth)
health += 10
qdel(K)
break
cycles = 0
cycles++
..()
/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
@@ -51,13 +64,14 @@
var/obj/item/clothing/suit/armor/A = H.wear_suit
if(A.armor && A.armor["melee"])
maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
maxHealth += 50
maxHealth += 200
health = maxHealth
name = "zombie"
desc = "A corpse animated by the alien being on its head."
melee_damage_lower = 10
melee_damage_upper = 15
ranged = 0
stat_attack = CONSCIOUS // Disables their targeting of dead mobs once they're already a zombie
icon = H.icon
speak = list('sound/creatures/zombie_idle1.ogg','sound/creatures/zombie_idle2.ogg','sound/creatures/zombie_idle3.ogg')
speak_chance = 50
@@ -105,7 +119,13 @@
I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray")
overlays += I
/mob/living/simple_animal/hostile/headcrab/CanAttack(atom/the_target)
if(stat_attack == DEAD && isliving(the_target) && !ishuman(the_target))
var/mob/living/L = the_target
if(L.stat == DEAD)
// Override default behavior of stat_attack, to stop headcrabs targeting dead mobs they cannot infect, such as silicons.
return FALSE
return ..()
/mob/living/simple_animal/hostile/headcrab/fast
name = "fast headcrab"
@@ -114,8 +134,8 @@
icon_state = "fast_headcrab"
icon_living = "fast_headcrab"
icon_dead = "fast_headcrab_dead"
health = 30
maxHealth = 30
health = 40
maxHealth = 40
ranged_cooldown_time = 30
jumpdistance = 8
jumpspeed = 2
@@ -144,11 +164,13 @@
icon_state = "poison_headcrab"
icon_living = "poison_headcrab"
icon_dead = "poison_headcrab_dead"
health = 60
maxHealth = 60
health = 80
maxHealth = 80
ranged_cooldown_time = 50
jumpdistance = 3
jumpspeed = 1
melee_damage_lower = 8
melee_damage_upper = 20
attack_sound = 'sound/creatures/ph_scream1.ogg'
speak_emote = list("screech")
@@ -167,6 +189,10 @@
/mob/living/simple_animal/hostile/headcrab/poison/AttackingTarget()
. = ..()
var/mob/living/carbon/C = target
if(C.can_inject(null, FALSE, "head", FALSE))
C.reagents.add_reagent("lsd", 5)
if(iscarbon(target) && target.reagents)
var/inject_target = pick("chest", "head")
var/mob/living/carbon/C = target
if(C.stunned || C.can_inject(null, FALSE, inject_target, FALSE))
if(C.eye_blurry < 60)
C.AdjustEyeBlurry(10)
visible_message("<span class='danger'>[src] buries its fangs deep into the [inject_target] of [target]!</span>")
@@ -22,6 +22,7 @@
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
sentience_type = SENTIENCE_OTHER
/mob/living/simple_animal/hostile/headslug/examine(mob/user)
. = ..()
@@ -1,6 +1,6 @@
// Hellhound
/mob/living/simple_animal/hostile/hellhound
// Sprites by FoS: http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// Sprites by FoS: https://www.paradisestation.org/forum/profile/335-fos
name = "Lesser Hellhound"
desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. A firey, lava-like substance drips from it."
icon_state = "hellhound"
@@ -8,7 +8,6 @@
icon_dead = "hellhound_dead"
icon_resting = "hellhound_rest"
mutations = list(BREATHLESS)
gold_core_spawnable = HOSTILE_SPAWN
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
@@ -92,11 +91,6 @@
return TRUE
return FALSE
/mob/living/simple_animal/hostile/hellhound/AttackingTarget()
. = ..()
if(. && ishuman(target) && (!client || a_intent == INTENT_HARM))
special_aoe()
/mob/living/simple_animal/hostile/hellhound/attackby(obj/item/C, mob/user, params)
. = ..()
if(target && isliving(target))
@@ -104,14 +98,6 @@
if(L.stat != CONSCIOUS)
target = user
/mob/living/simple_animal/hostile/hellhound/proc/special_aoe()
if(world.time < (smoke_lastuse + smoke_freq))
return
smoke_lastuse = world.time
var/datum/effect_system/smoke_spread/sleeping/smoke = new
smoke.set_up(10, 0, loc)
smoke.start()
/mob/living/simple_animal/hostile/hellhound/greater
name = "Greater Hellhound"
desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. Greater hounds are far stronger than their lesser kin, and typically employed by powerful bluespace entities."
@@ -121,9 +107,46 @@
maxHealth = 400
health = 400
force_threshold = 5 // no punching
universal_speak = 1
smoke_freq = 200
life_regen_cycle_trigger = 5
melee_damage_lower = 20
melee_damage_upper = 30
environment_smash = 2
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/hellhound/greater/New()
. = ..()
// Movement
AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
var/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/telespell = new
telespell.clothes_req = FALSE
telespell.invocation_type = "none"
AddSpell(telespell)
var/obj/effect/proc_holder/spell/aoe_turf/knock/knockspell = new
knockspell.invocation_type = "none"
AddSpell(knockspell)
// Defense
var/obj/effect/proc_holder/spell/targeted/forcewall/greater/wallspell = new
wallspell.clothes_req = FALSE
wallspell.invocation_type = "none"
AddSpell(wallspell)
// Offense
var/obj/effect/proc_holder/spell/aoe_turf/conjure/creature/summonspell = new
summonspell.charge_max = 1
summonspell.invocation_type = "none"
summonspell.summon_type = list(/mob/living/simple_animal/hostile/hellhound)
summonspell.summon_amt = 1
AddSpell(summonspell)
/mob/living/simple_animal/hostile/hellhound/greater/AttackingTarget()
. = ..()
if(. && ishuman(target) && (!client || a_intent == INTENT_HARM))
special_aoe()
/mob/living/simple_animal/hostile/hellhound/greater/proc/special_aoe()
if(world.time < (smoke_lastuse + smoke_freq))
return
smoke_lastuse = world.time
var/datum/effect_system/smoke_spread/sleeping/smoke = new
smoke.set_up(10, 0, loc)
smoke.start()
@@ -244,10 +244,10 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged/OpenFire(the_target)
if(Zapgun)
if(Zapgun.power_supply)
if(Zapgun.cell)
var/obj/item/ammo_casing/energy/shot = Zapgun.ammo_type[Zapgun.select]
if(Zapgun.power_supply.charge >= shot.e_cost)
Zapgun.power_supply.use(shot.e_cost)
if(Zapgun.cell.charge >= shot.e_cost)
Zapgun.cell.use(shot.e_cost)
Zapgun.update_icon()
..()
else if(Zapstick)
@@ -6,7 +6,7 @@
// -------------: AI: attacks to inject its venom, then retreats. Will inject its enemies multiple times then hang back to ensure they die.
// -------------: SPECIAL: venom that does more damage the more of it is in you
// -------------: TO FIGHT IT: if bitten once, retreat, get charcoal/etc treatment, and come back with a gun.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/black
name = "Black Terror spider"
@@ -5,7 +5,7 @@
// -------------: AI: none - this is strictly adminspawn-only and intended for RP events, coder testing, and teaching people 'how to queen'
// -------------: SPECIAL: Lay Eggs ability that allows laying queen-level eggs.
// -------------: TO FIGHT IT: run away screaming?
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress
name = "Empress of Terror"
@@ -6,7 +6,7 @@
// -------------: AI: hides in vents, emerges when prey is near to kill it, then hides again. Intended to scare normal crew.
// -------------: SPECIAL: invisible when on top of a vent, emerges when prey approaches or gets trapped in webs.
// -------------: TO FIGHT IT: shoot it through a window, or make it regret ambushing you
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/gray
name = "Gray Terror spider"
@@ -6,7 +6,7 @@
// -------------: AI: after it kills you, it webs you and lays new terror eggs on your body
// -------------: SPECIAL: can also create webs, web normal objects, etc
// -------------: TO FIGHT IT: kill it however you like - just don't die to it!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/green
name = "Green Terror spider"
@@ -6,7 +6,7 @@
// -------------: AI: no special ai
// -------------: SPECIAL: spawns an ungodly number of spiderlings when killed
// -------------: TO FIGHT IT: don't! Just leave it alone! It is harmless by itself... but god help you if you aggro it.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/mother
name = "Mother of Terror spider"
@@ -6,7 +6,7 @@
// -------------: AI: no special ai
// -------------: SPECIAL: massive health
// -------------: TO FIGHT IT: a squad of at least 4 people with laser rifles.
// -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766
// -------------: SPRITES FROM: Travelling Merchant, https://www.paradisestation.org/forum/profile/2715-travelling-merchant/
/mob/living/simple_animal/hostile/poison/terror_spider/prince
name = "Prince of Terror spider"
@@ -6,7 +6,7 @@
// -------------: AI: as green, but will evolve to queen when it can
// -------------: SPECIAL: can evolve into a queen, if fed enough
// -------------: TO FIGHT IT: kill it before it evolves
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/princess
name = "Princess of Terror spider"
@@ -6,7 +6,7 @@
// -------------: AI: dies if too far from queen
// -------------: SPECIAL: chance to stun on hit
// -------------: TO FIGHT IT: shoot it from range, bring friends!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/purple
name = "Purple Terror spider"
@@ -7,7 +7,7 @@
// -------------: AI: uses very powerful fangs to wreck people in melee
// -------------: SPECIAL: the more you hurt it, the harder it bites you
// -------------: TO FIGHT IT: shoot it from range. Kite it.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/red
name = "Red Terror spider"
@@ -5,7 +5,7 @@
// -------------: AI: injects a venom that makes you grow spiders in your body, then retreats
// -------------: SPECIAL: stuns you on first attack - vulnerable to groups while it does this
// -------------: TO FIGHT IT: blast it before it can get away
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
// -------------: SPRITES FROM: FoS, https://www.paradisestation.org/forum/profile/335-fos
/mob/living/simple_animal/hostile/poison/terror_spider/white
name = "White Terror spider"
@@ -28,6 +28,9 @@
del_on_death = 1
deathmessage = "lets out a contented sigh as their form unwinds."
/mob/living/simple_animal/shade/death(gibbed)
. = ..()
SSticker.mode.remove_cultist(src.mind, FALSE)
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/soulstone))
@@ -500,7 +500,7 @@
. |= pcollar.GetAccess()
/mob/living/simple_animal/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || stat || resting)
if(paralysis || stunned || IsWeakened() || stat || resting)
drop_r_hand()
drop_l_hand()
canmove = 0
+2
View File
@@ -344,6 +344,8 @@
return SetSleeping(max(sleeping, amount), updating, no_alert)
/mob/living/SetSleeping(amount, updating = 1, no_alert = FALSE)
if(frozen) // If the mob has been admin frozen, sleeping should not be changeable
return
. = STATUS_UPDATE_STAT
if((!!amount) == (!!sleeping)) // We're not changing from + to 0 or vice versa
updating = FALSE
+2 -2
View File
@@ -62,11 +62,11 @@
// Whether the mob is capable of standing or not
/mob/living/proc/can_stand()
return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
return !(IsWeakened() || paralysis || stat || (status_flags & FAKEDEATH))
// Whether the mob is capable of actions or not
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
if(stat || paralysis || stunned || IsWeakened() || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
return TRUE
// wonderful proc names, I know - used to check whether the blur overlay
+1 -1
View File
@@ -726,7 +726,7 @@ var/list/slot_equipment_priority = list( \
/mob/proc/print_flavor_text(var/shrink = 1)
if(flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
if(lentext(msg) <= 40 || !shrink)
if(length(msg) <= 40 || !shrink)
return "<span class='notice'>[html_encode(msg)]</span>" //Repeat after me, "I will not give players access to decoded HTML."
else
return "<span class='notice'>[copytext_preserve_html(msg, 1, 37)]... <a href='byond://?src=[UID()];flavor_more=1'>More...</a></span>"
+8 -8
View File
@@ -201,8 +201,8 @@
/proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
phrase = html_decode(phrase)
var/leng=lentext(phrase)
var/counter=lentext(phrase)
var/leng=length(phrase)
var/counter=length(phrase)
var/newphrase=""
var/newletter=""
while(counter>=1)
@@ -295,8 +295,8 @@
proc/muffledspeech(phrase)
phrase = html_decode(phrase)
var/leng=lentext(phrase)
var/counter=lentext(phrase)
var/leng=length(phrase)
var/counter=length(phrase)
var/newphrase=""
var/newletter=""
while(counter>=1)
@@ -568,10 +568,10 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
//Fixes renames not being reflected in objective text
var/length
var/pos
for(var/datum/objective/objective in all_objectives)
for(var/datum/objective/objective in GLOB.all_objectives)
if(!mind || objective.target != mind)
continue
length = lentext(oldname)
length = length(oldname)
pos = findtextEx(objective.explanation_text, oldname)
objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
return 1
@@ -610,8 +610,8 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
/proc/cultslur(n) // Inflicted on victims of a stun talisman
var/phrase = html_decode(n)
var/leng = lentext(phrase)
var/counter=lentext(phrase)
var/leng = length(phrase)
var/counter=length(phrase)
var/newphrase=""
var/newletter=""
while(counter>=1)
+1 -1
View File
@@ -373,9 +373,9 @@
if(character.mind.assigned_role == "Cyborg")
AnnounceCyborg(character, rank, join_message)
else
data_core.manifest_inject(character)
SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
if(!IsAdminJob(rank))
data_core.manifest_inject(character)
AnnounceArrival(character, rank, join_message)
AddEmploymentContract(character)
+3
View File
@@ -190,6 +190,9 @@
return
/mob/proc/IsWeakened()
return weakened
/mob/proc/Weaken()
return
+1 -4
View File
@@ -63,10 +63,7 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc )
// cyborgs produced by Robotize get an automatic power cell
O.cell = new(O)
O.cell.maxcharge = 7500
O.cell.charge = 7500
O.cell = new /obj/item/stock_parts/cell/high(O)
O.gender = gender
O.invisibility = 0
+5
View File
@@ -416,6 +416,11 @@ nanoui is used to open and update nano browser uis
if(!initial_data)
set_initial_data(src_object.ui_data(user, ui_key, state)) // Get the UI data.
// Preset the can_rezie and titlebar values on uis if the user has fancy uis set
// Prevents the ui from flickering when opened
if(user.client.prefs.nanoui_fancy)
set_window_options("focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=0;titlebar=0;")
user << browse(get_html(), "window=[window_id];[window_size][window_options]")
winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map
on_close_winset()
+1 -1
View File
@@ -317,7 +317,7 @@
src.add_fingerprint(user)
if(target == user && !user.incapacitated())
visible_message("<span class='warning'>[usr] jumps onto [src]!</span>")
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
else if(target != user && !user.restrained() && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis)
if(target.anchored) return
if(!ishuman(user)) return
visible_message("<span class='warning'>[usr] drags [target.name] onto [src]!</span>")
+6
View File
@@ -186,6 +186,12 @@
default_cartridge = /obj/item/cartridge/centcom
icon_state = "pda-h"
/obj/item/pda/centcom/New()
..()
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
if(M)
M.m_hidden = 1
//Some spare PDAs in a box
/obj/item/storage/box/PDAs
name = "spare PDAs"
+21 -12
View File
@@ -30,6 +30,11 @@
#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds
// APC malf status
#define APC_MALF_NOT_HACKED 1
#define APC_MALF_HACKED 2 // APC hacked by user, and user is in its core.
#define APC_MALF_SHUNTED_HERE 3 // User is shunted in this APC
#define APC_MALF_SHUNTED_OTHER 4 // User is shunted in another APC
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
// one per area, needs wire conection to power network through a terminal
@@ -205,7 +210,7 @@
has_electronics = 2 //installed and secured
// is starting with a power cell installed, create it and set its charge level
if(cell_type)
cell = new/obj/item/stock_parts/cell(src)
cell = new/obj/item/stock_parts/cell/upgraded(src)
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
@@ -749,18 +754,22 @@
/obj/machinery/power/apc/proc/get_malf_status(mob/living/silicon/ai/malf)
if(istype(malf) && malf.mind.has_antag_datum(/datum/antagonist/traitor))
if(malfai == (malf.parent || malf))
if(occupier == malf)
return 3 // 3 = User is shunted in this APC
else if(istype(malf.loc, /obj/machinery/power/apc))
return 4 // 4 = User is shunted in another APC
else
return 2 // 2 = APC hacked by user, and user is in its core.
if(!istype(malf))
return FALSE
// Only if they're a traitor OR they have the malf picker from the combat module
if(!malf.mind.has_antag_datum(/datum/antagonist/traitor) && !malf.malf_picker)
return FALSE
if(malfai == (malf.parent || malf))
if(occupier == malf)
return APC_MALF_SHUNTED_HERE
else if(istype(malf.loc, /obj/machinery/power/apc))
return APC_MALF_SHUNTED_OTHER
else
return 1 // 1 = APC not hacked.
return APC_MALF_HACKED
else
return 0 // 0 = User is not a Malf AI
return APC_MALF_NOT_HACKED
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
@@ -1008,7 +1017,7 @@
/obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf)
if(!istype(malf))
return
if(get_malf_status(malf) != 1)
if(get_malf_status(malf) != APC_MALF_NOT_HACKED)
return
if(malf.malfhacking)
to_chat(malf, "You are already hacking an APC.")
@@ -254,6 +254,7 @@
shot_number = 0
P.setDir(dir)
P.starting = loc
P.Angle = null
P.fire()
return P
@@ -110,8 +110,12 @@
/obj/singularity/process()
if(current_size >= STAGE_TWO)
if(allowed_size >= STAGE_TWO)
// Start moving even before we reach "true" stage two.
// If we are stage one and are sufficiently energetic to be allowed to 2,
// it might mean we are stuck in a corner somewere. So move around to try to expand.
move()
if(current_size >= STAGE_TWO)
pulse()
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
+18 -18
View File
@@ -5,7 +5,7 @@
icon = 'icons/obj/guns/energy.dmi'
fire_sound_text = "laser blast"
var/obj/item/stock_parts/cell/power_supply //What type of power cell this uses
var/obj/item/stock_parts/cell/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell
var/modifystate = 0
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
@@ -20,7 +20,7 @@
var/charge_delay = 4
/obj/item/gun/energy/emp_act(severity)
power_supply.use(round(power_supply.charge / severity))
cell.use(round(cell.charge / severity))
if(chambered)//phil235
if(chambered.BB)
qdel(chambered.BB)
@@ -30,15 +30,15 @@
update_icon()
/obj/item/gun/energy/get_cell()
return power_supply
return cell
/obj/item/gun/energy/New()
..()
if(cell_type)
power_supply = new cell_type(src)
cell = new cell_type(src)
else
power_supply = new(src)
power_supply.give(power_supply.maxcharge)
cell = new(src)
cell.give(cell.maxcharge)
update_ammo_types()
on_recharge()
if(selfcharge)
@@ -66,14 +66,14 @@
if(charge_tick < charge_delay)
return
charge_tick = 0
if(!power_supply)
if(!cell)
return // check if we actually need to recharge
var/obj/item/ammo_casing/energy/E = ammo_type[select]
if(use_external_power)
var/obj/item/stock_parts/cell/external = get_external_power_supply()
var/obj/item/stock_parts/cell/external = get_external_cell()
if(!external || !external.use(E.e_cost)) //Take power from the borg...
return //Note, uses /10 because of shitty mods to the cell system
power_supply.give(100) //... to recharge the shot
cell.give(100) //... to recharge the shot
on_recharge()
update_icon()
@@ -91,14 +91,14 @@
/obj/item/gun/energy/can_shoot()
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
return power_supply.charge >= shot.e_cost
return cell.charge >= shot.e_cost
/obj/item/gun/energy/newshot()
if(!ammo_type || !power_supply)
if(!ammo_type || !cell)
return
if(!chambered)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell...
if(cell.charge >= shot.e_cost) //if there's enough power in the cell cell...
chambered = shot //...prepare a new shot based on the current ammo type selected
if(!chambered.BB)
chambered.newshot()
@@ -106,7 +106,7 @@
/obj/item/gun/energy/process_chamber()
if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
var/obj/item/ammo_casing/energy/shot = chambered
power_supply.use(shot.e_cost)//... drain the power_supply cell
cell.use(shot.e_cost)//... drain the cell cell
robocharge()
chambered = null //either way, released the prepared shot
newshot()
@@ -131,7 +131,7 @@
/obj/item/gun/energy/update_icon()
overlays.Cut()
var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections)
var/ratio = Ceiling((cell.charge / cell.maxcharge) * charge_sections)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
var/iconState = "[icon_state]_charge"
var/itemState = null
@@ -142,7 +142,7 @@
iconState += "_[shot.select_name]"
if(itemState)
itemState += "[shot.select_name]"
if(power_supply.charge < shot.e_cost)
if(cell.charge < shot.e_cost)
overlays += "[icon_state]_empty"
else
if(!shaded_charge)
@@ -172,7 +172,7 @@
user.visible_message("<span class='suicide'>[user] melts [user.p_their()] face off with the [name]!</span>")
playsound(loc, fire_sound, 50, 1, -1)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
power_supply.use(shot.e_cost)
cell.use(shot.e_cost)
update_icon()
return FIRELOSS
else
@@ -198,9 +198,9 @@
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
if(R.cell.use(shot.e_cost)) //Take power from the borg...
power_supply.give(shot.e_cost) //... to recharge the shot
cell.give(shot.e_cost) //... to recharge the shot
/obj/item/gun/energy/proc/get_external_power_supply()
/obj/item/gun/energy/proc/get_external_cell()
if(istype(loc, /obj/item/rig_module))
var/obj/item/rig_module/module = loc
if(module.holder && module.holder.wearer)
@@ -106,7 +106,7 @@
empty()
/obj/item/gun/energy/kinetic_accelerator/proc/empty()
power_supply.use(500)
cell.use(500)
update_icon()
/obj/item/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
@@ -136,7 +136,7 @@
return
/obj/item/gun/energy/kinetic_accelerator/proc/reload()
power_supply.give(500)
cell.give(500)
on_recharge()
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
@@ -39,8 +39,8 @@
/obj/item/gun/energy/gun/mini/New()
gun_light = new /obj/item/flashlight/seclite(src)
..()
power_supply.maxcharge = 600
power_supply.charge = 600
cell.maxcharge = 600
cell.charge = 600
/obj/item/gun/energy/gun/mini/update_icon()
..()
@@ -43,7 +43,7 @@
/obj/item/gun/energy/decloner/update_icon()
..()
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(power_supply.charge > shot.e_cost)
if(cell.charge > shot.e_cost)
overlays += "decloner_spin"
// Flora Gun //
@@ -160,26 +160,26 @@
/obj/item/gun/energy/plasmacutter/examine(mob/user)
. = ..()
if(power_supply)
. += "<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>"
if(cell)
. += "<span class='notice'>[src] is [round(cell.percent())]% charged.</span>"
/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
if(power_supply.charge >= power_supply.maxcharge)
if(cell.charge >= cell.maxcharge)
to_chat(user,"<span class='notice'>[src] is already fully charged.")
return
var/obj/item/stack/sheet/S = A
S.use(1)
power_supply.give(1000)
cell.give(1000)
on_recharge()
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
else if(istype(A, /obj/item/stack/ore/plasma))
if(power_supply.charge >= power_supply.maxcharge)
if(cell.charge >= cell.maxcharge)
to_chat(user,"<span class='notice'>[src] is already fully charged.")
return
var/obj/item/stack/ore/S = A
S.use(1)
power_supply.give(500)
cell.give(500)
on_recharge()
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
else
@@ -489,7 +489,7 @@
M.update_inv_r_hand()
/obj/item/gun/energy/temperature/proc/update_charge()
var/charge = power_supply.charge
var/charge = cell.charge
switch(charge)
if(900 to INFINITY) overlays += "900"
if(800 to 900) overlays += "800"
+21 -3
View File
@@ -24,7 +24,7 @@
var/p_x = 16
var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
var/speed = 1 //Amount of deciseconds it takes for projectile to travel
var/Angle = 0
var/Angle = null
var/spread = 0 //amount (in degrees) of projectile spread
var/legacy = FALSE //legacy projectile system
animate_movement = 0
@@ -240,8 +240,7 @@
if(!paused)
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!Angle)
if(isnull(Angle))
Angle=round(Get_Angle(src,current))
if(spread)
Angle += (rand() - 0.5) * spread
@@ -302,6 +301,25 @@
Range()
sleep(1)
obj/item/projectile/proc/reflect_back(atom/source, list/position_modifiers = list(0, 0, 0, 0, 0, -1, 1, -2, 2))
if(starting)
var/new_x = starting.x + pick(position_modifiers)
var/new_y = starting.y + pick(position_modifiers)
var/turf/curloc = get_turf(source)
if(ismob(source))
firer = source // The reflecting mob will be the new firer
else
firer = null // Reflected by something other than a mob so firer will be null
// redirect the projectile
original = locate(new_x, new_y, z)
starting = curloc
current = curloc
yo = new_y - curloc.y
xo = new_x - curloc.x
Angle = null // Will be calculated in fire()
obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
+1 -1
View File
@@ -47,7 +47,7 @@
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
damage = 36
damage = 30
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
@@ -314,7 +314,6 @@ var/const/INGEST = 2
if(update_flags & STATUS_UPDATE_CANMOVE)
M.update_canmove()
if(update_flags & STATUS_UPDATE_STAMINA)
M.handle_hud_icons_health()
M.update_stamina()
if(update_flags & STATUS_UPDATE_BLIND)
M.update_blind_effects()

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