mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 14:07:51 +01:00
Merge remote-tracking branch 'ParadiseSS13/master' into forum_integration_improvement
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -190,6 +190,9 @@
|
||||
return
|
||||
|
||||
|
||||
/mob/proc/IsWeakened()
|
||||
return weakened
|
||||
|
||||
/mob/proc/Weaken()
|
||||
return
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user