Resolves conflicts, I hope.

This commit is contained in:
Neerti
2014-12-08 20:46:55 -05:00
109 changed files with 885 additions and 960 deletions
+16 -4
View File
@@ -169,17 +169,29 @@ var/global/floorIsLava = 0
<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>
<br>
"}
if (M.client)
body += {"<br><br>
body += {"<br><br>
<b>Other actions:</b>
<br>
<A href='?src=\ref[src];forcespeech=\ref[M]'>Forcesay</A> |
<A href='?src=\ref[src];forcespeech=\ref[M]'>Forcesay</A>
"}
if (M.client)
body += {" |
<A href='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> |
<A href='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> |
<A href='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> |
<A href='?src=\ref[src];tdomeobserve=\ref[M]'>Thunderdome Observer</A> |
"}
// language toggles
body += "<br><br><b>Languages:</b><br>"
var/f = 1
for(var/k in all_languages)
var/datum/language/L = all_languages[k]
if(!f) body += " | "
else f = 0
if(L in M.languages)
body += "<a href='?src=\ref[src];toglang=\ref[M];lang=[html_encode(k)]' style='color:#006600'>[k]</a>"
else
body += "<a href='?src=\ref[src];toglang=\ref[M];lang=[html_encode(k)]' style='color:#ff0000'>[k]</a>"
body += {"<br>
</body></html>
+25 -10
View File
@@ -1496,14 +1496,11 @@
//open a browse window listing the contents instead
var/data = ""
var/obj/item/weapon/paper_bundle/B = fax
for (var/page = 1, page <= B.amount, page++)
var/obj/pageobj = B.contents[page]
data += "<A href='?src=\ref[src];AdminFaxViewPage=[page];paper_bundle=\ref[B]'>Page [page] - [pageobj.name]</A><BR>"
world << data
world << "usr = [usr]"
usr << browse(data, "window=[B.name]")
else
usr << "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]"
@@ -1511,9 +1508,9 @@
else if (href_list["AdminFaxViewPage"])
var/page = text2num(href_list["AdminFaxViewPage"])
var/obj/item/weapon/paper_bundle/bundle = locate(href_list["paper_bundle"])
if (!bundle) return
if (istype(bundle.contents[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = bundle.contents[page]
P.show_content(src.owner, 1)
@@ -1530,13 +1527,13 @@
if(!input) return
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
// Create the reply message
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us
P.name = "[command_name()]- [customname]"
P.info = input
P.update_icon()
// Stamps
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
@@ -1552,7 +1549,7 @@
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1)
else
src.owner << "\red Message reply failed."
spawn(100)
del(P)
return
@@ -2757,6 +2754,24 @@
if(href_list["vsc"] == "default")
vsc.SetDefault(usr)
else if(href_list["toglang"])
if(check_rights(R_SPAWN))
var/mob/M = locate(href_list["toglang"])
if(!istype(M))
usr << "[M] is illegal type, must be /mob!"
return
var/lang2toggle = href_list["lang"]
var/datum/language/L = all_languages[lang2toggle]
if(L in M.languages)
if(!M.remove_language(lang2toggle))
usr << "Failed to remove language '[lang2toggle]' from \the [M]!"
else
if(!M.add_language(lang2toggle))
usr << "Failed to add language '[lang2toggle]' from \the [M]!"
show_player_panel(M)
// player info stuff
if(href_list["add_player_info"])
+19 -12
View File
@@ -1,9 +1,18 @@
#define AHELP_ADMIN 1
#define AHELP_MENTOR 2
#define AHELP_DEV 3
//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE!
var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as")
/client/verb/adminhelp(msg as null|text)
var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHELP_MENTOR,\
"Admin - Rule/Gameplay issue" = AHELP_ADMIN,\
"Dev - Bug report" = AHELP_DEV)
/client/proc/adminhelp_admin(message)
adminhelp("Admin - Rule/Gameplay issue", message)
/client/verb/adminhelp(selected_type in adminhelp_categories, msg as text)
set category = "Admin"
set name = "Adminhelp"
@@ -24,12 +33,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps//Go to hell
**/
var/list/type = list ("Gameplay/Roleplay question", "Rule/Gameplay issue", "Bug report")
var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type
if(!selected_type)
return
if(!msg)
msg = input("Please enter your message:", "Admin Help", null, null) as text
if(!msg || alert("The following message will be sent to staff that administers\n the '[selected_type]' category:\n\n[msg]\n", "Admin Help", "Ok", "Cancel") == "Cancel")
return
@@ -130,8 +133,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(X.is_afk())
admin_number_afk++
switch(selected_type)
if("Gameplay/Roleplay question")
switch(adminhelp_categories[selected_type])
if(AHELP_MENTOR)
if(mentorholders.len)
for(var/client/X in mentorholders) // Mentors get a message without buttons and no character name
if(X.prefs.toggles & SOUND_ADMINHELP)
@@ -142,13 +145,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
if("Rule/Gameplay issue")
if(AHELP_ADMIN)
if(adminholders.len)
for(var/client/X in adminholders) // Admins of course get everything in their helps
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
if("Bug report")
if(AHELP_DEV)
if(debugholders.len)
for(var/client/X in debugholders)
if(R_ADMIN | R_MOD & X.holder.rights) // Admins get every button & special highlights in theirs
@@ -183,3 +186,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
send2adminirc("[selected_upper] from [key_name(src)]: [html_decode(original_msg)]")
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
#undef AHELP_ADMIN
#undef AHELP_MENTOR
#undef AHELP_DEV
+1 -1
View File
@@ -96,7 +96,7 @@
if(sender)
C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
else
adminhelp(reply) //sender has left, adminhelp instead
adminhelp_admin(reply) //sender has left, adminhelp instead
return
src << "<span class='pm'><span class='out'>" + create_text_tag("pm_out_alt", "PM", src) + " to <span class='name'>[get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]</span>: <span class='message'>[msg]</span></span></span>"
C << "<span class='pm'><span class='in'>" + create_text_tag("pm_in", "", C) + " <b>\[[recieve_pm_type] PM\]</b> <span class='name'>[get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]</span>: <span class='message'>[msg]</span></span></span>"
-2
View File
@@ -460,8 +460,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
call(/datum/game_mode/proc/equip_syndicate)(new_character)
if("Ninja")
new_character.equip_space_ninja()
new_character.internal = new_character.s_store
new_character.internals.icon_state = "internal1"
if(ninjastart.len == 0)
new_character << "<B>\red A proper starting location for you could not be found, please report this bug!</B>"
new_character << "<B>\red Attempting to place at a carpspawn.</B>"
@@ -138,11 +138,15 @@
if(ai_card)
if(istype(ai_card, /obj/item/device/aicard))
if(integrated_ai && integrated_ai.client)
if(integrated_ai && !integrated_ai.stat)
if(user)
user << "<span class='danger'>You cannot eject your currently stored AI. Purge it manually.</span>"
return 0
del(ai_card)
user << "<span class='danger'>You purge the remaining scraps of data from your previous AI, freeing it for use.</span>"
if(integrated_ai)
integrated_ai.ghostize()
del(integrated_ai)
if(ai_card) del(ai_card)
else if(user)
user.put_in_hands(ai_card)
else
@@ -58,7 +58,9 @@
desc = "You think it's called an Elder Sarsparilla or something."
interface_name = "Alden-Saraspova counter"
interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
selectable = 1
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/device/ano_scanner
/obj/item/rig_module/device/orescanner
@@ -66,12 +68,9 @@
desc = "A clunky old ore scanner."
interface_name = "ore detector"
interface_desc = "A sonar system for detecting large masses of ore."
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/weapon/mining_scanner
/obj/item/rig_module/device/rcd
@@ -17,7 +17,7 @@
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \
/obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
/obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller)
initial_modules = list(
/obj/item/rig_module/ai_container,
@@ -51,16 +51,16 @@
/obj/item/weapon/rig/hazmat
name = "AMI control module"
suit_type = "hazmat"
suit_type = "hazmat hardsuit"
desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it."
icon_state = "medical_rig" //placeholder
icon_state = "science_rig"
armor = list(melee = 15, bullet = 15, laser = 80, energy = 80, bomb = 60, bio = 100, rad = 100)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
//Todo: add xenoarch gear.
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
req_access = list(access_rd)
@@ -70,5 +70,40 @@
/obj/item/rig_module/device/anomaly_scanner
)
boot_type = null
glove_type = null
/obj/item/weapon/rig/medical
name = "rescue suit control module"
suit_type = "rescue hardsuit"
desc = "A durable suit designed for medical rescue in high risk areas."
icon_state = "medical_rig"
armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller )
req_access = null
req_one_access = null
initial_modules = list(
/obj/item/rig_module/chem_dispenser/injector,
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/device/healthscanner
)
/obj/item/weapon/rig/hazard
name = "hazard hardsuit control module"
suit_type = "hazard hardsuit"
desc = "A Nanotrasen security hardsuit designed for prolonged EVA in dangerous environments. The name HARPER is printed on the control unit."
icon_state = "hazard_rig"
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton)
req_access = null
req_one_access = null
-7
View File
@@ -129,8 +129,6 @@
create_reagents(200)
connect()
update_icon()
if(closed_system)
flags &= ~OPENCONTAINER
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
@@ -777,11 +775,6 @@
closed_system = !closed_system
usr << "You [closed_system ? "close" : "open"] the tray's lid."
if(closed_system)
flags &= ~OPENCONTAINER
else
flags |= OPENCONTAINER
update_icon()
/obj/machinery/portable_atmospherics/hydroponics/soil
+1 -1
View File
@@ -25,7 +25,7 @@
/datum/seed/proc/request_player(var/mob/living/host)
if(!host) return
for(var/mob/dead/observer/O in player_list)
if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(O, "Diona") && config.usealienwhitelist))
if(jobban_isbanned(O, "Dionaea"))
continue
if(O.client)
if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying))
+45 -17
View File
@@ -1,31 +1,31 @@
//This is the proc for gibbing a mob. Cannot gib ghosts.
//added different sort of gibs and animations. N
/mob/proc/gib()
/mob/proc/gib(anim="gibbed-m",do_gibs)
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
update_canmove()
dead_mob_list -= src
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("gibbed-m", animation)
gibs(loc, viruses, dna)
flick(anim, animation)
if(do_gibs) gibs(loc, viruses, dna)
dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
//This is the proc for turning a mob into ash. Mostly a copy of gib code (above).
//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here.
//Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N
/mob/proc/dust()
/mob/proc/dust(anim="dust-m",remains=/obj/effect/decal/cleanable/ash)
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
@@ -38,8 +38,8 @@
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("dust-m", animation)
new /obj/effect/decal/cleanable/ash(loc)
flick(anim, animation)
new remains(loc)
dead_mob_list -= src
spawn(15)
@@ -47,17 +47,45 @@
if(src) del(src)
/mob/proc/death(gibbed)
/mob/proc/death(gibbed,deathmessage="seizes up and falls limp...")
if(stat == DEAD)
return 0
if(!gibbed)
src.visible_message("<b>\The [src.name]</b> [deathmessage]")
stat = DEAD
update_canmove()
dizziness = 0
jitteriness = 0
layer = MOB_LAYER
if(blind && client)
blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
//Quick fix for corpses kept propped up in chairs. ~Z
drop_r_hand()
drop_l_hand()
//End of fix.
if(healths)
healths.icon_state = "health6"
timeofdeath = world.time
var/tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
if(mind) mind.store_memory("Time of death: [worldtime2text()]", 0)
living_mob_list -= src
dead_mob_list += src
return ..(gibbed)
dead_mob_list |= src
updateicon()
if(ticker && ticker.mode)
ticker.mode.check_win()
return 1
+11 -8
View File
@@ -8,7 +8,7 @@
//Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE')
//Or someone snoring. So we make it where they won't hear it.
return
//make sure the air can transmit speech - hearer's side
var/turf/T = get_turf(src)
if (T)
@@ -16,22 +16,22 @@
var/pressure = (environment)? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
return
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
if(sleeping || stat == 1)
hear_sleep(message)
return
var/style = "body"
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
@@ -89,11 +89,14 @@
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
message = pick(S.speak)
if(S.speak && S.speak.len)
message = pick(S.speak)
else
return
else
message = stars(message)
@@ -173,7 +176,7 @@
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
return
if(say_understands(speaker, language))
message = "<B>[src]</B> [verb], \"[message]\""
else
+1
View File
@@ -58,6 +58,7 @@
desc = "It's a tiny plant critter."
icon_state = "nymph"
origin_tech = "magnets=3;biotech=5"
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
name = "maintenance drone"
+1 -1
View File
@@ -81,7 +81,7 @@
ask_verb = "creels"
exclaim_verb = "SHRIEKS"
colour = "vox"
key = "v"
key = "5"
flags = RESTRICTED
/datum/language/diona
+2 -8
View File
@@ -52,14 +52,8 @@
death(gibbed)
if(key)
var/mob/dead/observer/ghost = new(src)
ghost.name = ghost_name
ghost.real_name = ghost_name
ghost.key = key
if (ghost.client)
ghost.client.eye = ghost
return ..(gibbed)
ghostize()
..(gibbed)
blob_act()
+3 -12
View File
@@ -1,13 +1,4 @@
/mob/living/carbon/alien/death(gibbed)
if(stat == DEAD) return
if(healths) healths.icon_state = "health6"
stat = DEAD
if(dead_icon) icon_state = dead_icon
if(!gibbed)
update_canmove()
if(client) blind.layer = 0
return ..(gibbed)
if(!gibbed && dead_icon)
icon_state = dead_icon
return ..(gibbed,"lets out a waning guttural screech, green blood bubbling from its maw.")
@@ -12,8 +12,8 @@
var/list/donors = list()
var/last_checked_stage = 0
universal_understand = 0 // Dionaea do not need to speak to people
universal_speak = 0 // before becoming an adult. Use *chirp.
universal_understand = 1
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
holder_type = /obj/item/weapon/holder/diona
/mob/living/carbon/alien/diona/New()
@@ -5,6 +5,9 @@
set name = "Merge with gestalt"
set desc = "Merge with another diona."
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
if(istype(src.loc,/mob/living/carbon))
src.verbs -= /mob/living/carbon/alien/diona/proc/merge
return
@@ -40,6 +43,9 @@
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
if(!(istype(src.loc,/mob/living/carbon)))
src.verbs -= /mob/living/carbon/alien/diona/proc/split
return
@@ -64,6 +70,9 @@
set name = "Steal Blood"
set desc = "Take a blood sample from a suitable donor."
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
var/list/choices = list()
for(var/mob/living/carbon/human/H in oview(1,src))
if(src.Adjacent(H))
@@ -36,6 +36,9 @@
if (!muzzled)
message = "<B>[src]</B> burps."
m_type = 2
if("deathgasp")
message = "<B>The [src.name]</B> lets out a waning guttural screech, green blood bubbling from its maw."
m_type = 2
if("scratch")
if (!src.restrained())
message = "<B>The [src.name]</B> scratches."
+5 -5
View File
@@ -61,28 +61,28 @@
silent = 0
else
updatehealth()
handle_stunned()
handle_weakened()
if(health <= 0)
death()
blinded = 1
silent = 0
return 1
if(paralysis)
AdjustParalysis(-1)
if(paralysis && paralysis > 0)
handle_paralysed()
blinded = 1
stat = UNCONSCIOUS
if(halloss > 0)
adjustHalLoss(-3)
else if(sleeping)
if(sleeping)
adjustHalLoss(-3)
if (mind)
if((mind.active && client != null) || immune_to_ssd)
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
else if(resting)
if(halloss > 0)
adjustHalLoss(-3)
+4 -35
View File
@@ -1,43 +1,12 @@
/mob/living/carbon/brain/death(gibbed)
if(stat == DEAD) return
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
for(var/mob/O in viewers(container, null))
O.show_message(text("\red <B>[]'s MMI flatlines!</B>", src), 1, "\red You hear something flatline.", 2)
if(!gibbed && istype(container, /obj/item/device/mmi)) //If not gibbed but in a container.
container.icon_state = "mmi_dead"
stat = DEAD
if(blind) blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0) //mind. ?
return ..(gibbed)
return ..(gibbed,"beeps shrilly as the MMI flatlines!")
/mob/living/carbon/brain/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("gibbed-m", animation)
gibs(loc, viruses, dna)
dead_mob_list -= src
if(container && istype(container, /obj/item/device/mmi))
if(istype(container, /obj/item/device/mmi))
del(container)//Gets rid of the MMI if there is one
if(loc)
if(istype(loc,/obj/item/organ/brain))
del(loc)//Gets rid of the brain item
spawn(15)
if(animation) del(animation)
if(src) del(src)
..(null,1)
+1 -1
View File
@@ -57,7 +57,7 @@
for(var/mob/N in viewers(src, null))
if(N.client)
N.show_message(text("\red <B>[M] bursts out of [src]!</B>"), 2)
. = ..()
. = ..(null,1)
/mob/living/carbon/attack_hand(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
@@ -6,6 +6,9 @@
set name = "Fertilize plant"
set desc = "Turn your food into nutrients for plants."
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.nutrilevel < 10 && src.Adjacent(tray))
@@ -25,6 +28,9 @@
set name = "Eat Weeds"
set desc = "Clean the weeds out of soil or a hydroponics tray."
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.weedlevel > 0 && src.Adjacent(tray))
+14 -62
View File
@@ -1,15 +1,4 @@
/mob/living/carbon/human/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
for(var/datum/organ/external/E in src.organs)
if(istype(E, /datum/organ/external/chest))
@@ -19,49 +8,25 @@
// Override the current limb status and don't cause an explosion
E.droplimb(1,1)
..(species ? species.gibbed_anim : "gibbed-h")
if(species)
flick(species.gibbed_anim, animation)
hgibs(loc, viruses, dna, species.flesh_color, species.blood_color)
else
flick("gibbed-h", animation)
hgibs(loc, viruses, dna)
spawn(15)
if(animation) del(animation)
if(src) del(src)
/mob/living/carbon/human/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick(species.dusted_anim, animation)
new species.remains_type(loc)
spawn(15)
if(animation) del(animation)
if(src) del(src)
if(species)
..(species.dusted_anim, species.remains_type)
else
..()
/mob/living/carbon/human/death(gibbed)
if(stat == DEAD) return
if(healths) healths.icon_state = "health5"
stat = DEAD
dizziness = 0
jitteriness = 0
if(stat == DEAD) return
hud_updateflag |= 1 << HEALTH_HUD
hud_updateflag |= 1 << STATUS_HUD
handle_hud_list()
//Handle species-specific deaths.
@@ -88,30 +53,17 @@
callHook("death", list(src, gibbed))
//Check for heist mode kill count.
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )
//Check for last assailant's mutantrace.
/*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) )
var/mob/living/carbon/human/V = LAssailant
if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking.
//world << "Vox kills: [vox_kills]"
vox_kills++ //Bad vox. Shouldn't be killing humans.
if(!gibbed && species.death_sound)
playsound(loc, species.death_sound, 80, 1, 1)
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD // Doing this with the deathgasp emote seems odd.
if(species && species.death_sound) playsound(loc, species.death_sound, 80, 1, 1)
update_canmove()
if(client) blind.layer = 0
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
if(ticker && ticker.mode)
// world.log << "k"
sql_report_death(src)
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
return ..(gibbed)
ticker.mode.check_win()
if(istype(ticker.mode,/datum/game_mode/heist))
vox_kills++ //Bad vox. Shouldn't be killing humans.
return ..(gibbed,species.death_message)
/mob/living/carbon/human/proc/makeSkeleton()
if(SKELETON in src.mutations) return
@@ -1,4 +1,8 @@
/mob/living/carbon/slime/death(gibbed)
if(stat == DEAD) return
stat = DEAD
if(!gibbed)
if(is_adult)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
@@ -12,17 +16,7 @@
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(stat == DEAD) return
stat = DEAD
icon_state = "[colour] baby slime dead"
overlays.len = 0
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> seizes up and falls limp...", 1) //ded -- Urist
update_canmove()
if(blind) blind.layer = 0
if(ticker && ticker.mode)
ticker.mode.check_win()
overlays.Cut()
return ..(gibbed)
+3 -51
View File
@@ -1,56 +1,8 @@
/mob/living/carbon/monkey/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("gibbed-m", animation)
gibs(loc, viruses, dna)
spawn(15)
if(animation) del(animation)
if(src) del(src)
..(null,1)
/mob/living/carbon/monkey/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("dust-m", animation)
new /obj/effect/decal/cleanable/ash(loc)
spawn(15)
if(animation) del(animation)
if(src) del(src)
..("dust-m")
/mob/living/carbon/monkey/death(gibbed)
if(stat == DEAD) return
if(healths) healths.icon_state = "health5"
stat = DEAD
if(!gibbed)
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> lets out a faint chimper as it collapses and stops moving...", 1) //ded -- Urist
update_canmove()
if(blind) blind.layer = 0
ticker.mode.check_win()
return ..(gibbed)
..(gibbed,"lets out a faint chimper as it collapses and stops moving...")
+2 -1
View File
@@ -457,8 +457,9 @@
set name = "Resist"
set category = "IC"
if(!isliving(usr) || usr.next_move > world.time)
if(usr.stat || !isliving(usr) || usr.next_move > world.time)
return
usr.next_move = world.time + 20
var/mob/living/L = usr
+7 -1
View File
@@ -2,14 +2,20 @@
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Abilities"
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
handle_ventcrawl()
return
/mob/living/proc/hide()
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
set category = "Abilities"
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
if (layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
src << text("\blue You are now hiding.")
+5 -5
View File
@@ -13,7 +13,7 @@ var/list/department_radio_keys = list(
":t" = "Mercenary", "#t" = "Mercenary", ".t" = "Mercenary",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":v" = "Service", "#v" = "Service", ".v" = "Service",
":o" = "AI Private", "#o" = "AI Private", ".o" = "AI Private",
":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private",
":R" = "right ear", "#R" = "right ear", ".R" = "right ear",
":L" = "left ear", "#L" = "left ear", ".L" = "left ear",
@@ -28,7 +28,7 @@ var/list/department_radio_keys = list(
":T" = "Mercenary", "#T" = "Mercenary", ".T" = "Mercenary",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":V" = "Service", "#V" = "Service", ".V" = "Service",
":O" = "AI Private", "#O" = "AI Private", ".O" = "AI Private",
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -91,7 +91,7 @@ proc/get_radio_key_from_channel(var/channel)
if (speaking.flags & SIGNLANG)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
var/list/listening = list()
var/list/listening_obj = list()
@@ -101,11 +101,11 @@ proc/get_radio_key_from_channel(var/channel)
var/pressure = (environment)? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE)
message_range = 1
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
var/list/hear = hear(message_range, T)
var/list/hearturfs = list()
-32
View File
@@ -421,13 +421,6 @@ var/list/ai_verbs_default = list(
user.reset_view(camera)
return 1
/mob/living/silicon/ai/blob_act()
if (stat != 2)
adjustBruteLoss(60)
updatehealth()
return 1
return 0
/mob/living/silicon/ai/restrained()
return 0
@@ -440,26 +433,6 @@ var/list/ai_verbs_default = list(
ai_call_shuttle()
..()
/mob/living/silicon/ai/ex_act(severity)
if(!blinded)
flick("flash", flash)
switch(severity)
if(1.0)
if (stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(2.0)
if (stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
updatehealth()
/mob/living/silicon/ai/Topic(href, href_list)
if(usr != src)
return
@@ -525,11 +498,6 @@ var/list/ai_verbs_default = list(
updatehealth()
return
/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
return 2
/mob/living/silicon/ai/reset_view(atom/A)
if(camera)
camera.SetLuminosity(0)
+9 -13
View File
@@ -1,20 +1,19 @@
/mob/living/silicon/ai/death(gibbed)
if(stat == DEAD) return
stat = DEAD
if(stat == DEAD)
return
if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
icon_state = "[ckey]-ai-crash"
else icon_state = "ai-crash"
update_canmove()
else
icon_state = "ai-crash"
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
if(blind) blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
remove_ai_verbs(src)
var/callshuttle = 0
for(var/obj/machinery/computer/communications/commconsole in world)
if(commconsole.z == 2)
continue
@@ -48,14 +47,11 @@
spawn(10)
explosion(src.loc, 3, 6, 12, 15)
for(var/obj/machinery/ai_status_display/O in world) //change status
for(var/obj/machinery/ai_status_display/O in world)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
var/obj/item/device/aicard/card = loc
card.update_icon()
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
return ..(gibbed)
+7 -36
View File
@@ -1,41 +1,12 @@
/mob/living/silicon/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("gibbed-r", animation)
..("gibbed-r")
robogibs(loc, viruses)
dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
/mob/living/silicon/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
..("dust-r", /obj/effect/decal/remains/robot)
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("dust-r", animation)
new /obj/effect/decal/remains/robot(loc)
dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
/mob/living/silicon/death(gibbed,deathmessage)
if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
var/obj/machinery/recharge_station/RC = loc
RC.go_out()
return ..(gibbed,deathmessage)
@@ -1,10 +1,8 @@
/mob/living/silicon/decoy/death(gibbed)
if(stat == DEAD) return
stat = DEAD
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
for(var/obj/machinery/ai_status_display/O in world) //change status
O.mode = 2
return ..(gibbed)
+10 -15
View File
@@ -1,18 +1,13 @@
/mob/living/silicon/pai/death(gibbed)
if(stat == DEAD) return
stat = DEAD
canmove = 0
if(blind) blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
//var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
//mind.store_memory("Time of death: [tod]", 0)
//New pAI's get a brand new mind to prevent meta stuff from their previous life. This new mind causes problems down the line if it's not deleted here.
//Read as: I have no idea what I'm doing but asking for help got me nowhere so this is what you get. - Nodrak
if(mind) del(mind)
living_mob_list -= src
if(card)
card.removePersonality()
if(gibbed)
src.loc = get_turf(card)
del(card)
else
close_up()
if(mind)
del(mind)
..(gibbed)
ghostize()
del(src)
+10 -2
View File
@@ -1,6 +1,8 @@
/mob/living/silicon/pai/Life()
if (src.stat == 2)
return
if(src.cable)
if(get_dist(src, src.cable) > 1)
var/turf/T = get_turf_or_move(src.loc)
@@ -9,20 +11,26 @@
del(src.cable)
regular_hud_updates()
if(src.secHUD == 1)
process_sec_hud(src, 1)
if(src.medHUD == 1)
process_med_hud(src, 1)
if(silence_time)
if(world.timeofday >= silence_time)
silence_time = null
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
handle_statuses()
if(health <= 0)
death(null,"gives one shrill beep before falling lifeless.")
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
else
health = 100 - getBruteLoss() - getFireLoss()
health = 100 - getBruteLoss() - getFireLoss()
+2 -26
View File
@@ -169,28 +169,7 @@
if(3)
src << "<font color=green>You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.</font>"
/mob/living/silicon/pai/ex_act(severity)
if(!blinded)
flick("flash", src.flash)
switch(severity)
if(1.0)
if (src.stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(2.0)
if (src.stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (src.stat != 2)
adjustBruteLoss(30)
src.updatehealth()
// See software.dm for Topic()
/mob/living/silicon/pai/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
@@ -201,10 +180,6 @@
src.updatehealth()
return
//mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj)
///mob/living/silicon/pai/attack_hand(mob/living/carbon/M as mob)
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
if(istype(usr, /mob/living))
var/mob/living/U = usr
@@ -376,7 +351,8 @@
src.updatehealth()
else
visible_message("<span class='warning'>[user.name] bonks [src] harmlessly with [W].</span>")
if(stat != 2) close_up()
spawn(1)
if(stat != 2) close_up()
return
/mob/living/silicon/pai/attack_hand(mob/user as mob)
+8 -65
View File
@@ -1,72 +1,15 @@
/mob/living/silicon/robot/gib()
//robots don't die when gibbed. instead they drop their MMI'd brain
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("gibbed-r", animation)
robogibs(loc, viruses)
living_mob_list -= src
dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
/mob/living/silicon/robot/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("dust-r", animation)
new /obj/effect/decal/remains/robot(loc)
if(mmi) del(mmi) //Delete the MMI first so that it won't go popping out.
dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
//Delete the MMI first so that it won't go popping out.
if(mmi)
del(mmi)
..()
/mob/living/silicon/robot/death(gibbed)
if(stat == DEAD) return
if(!gibbed)
emote("deathgasp")
stat = DEAD
update_canmove()
if(camera)
camera.status = 0
if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
var/obj/machinery/recharge_station/RC = loc
RC.go_out()
if(module)
var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module
if(G) G.drop_item()
remove_robot_verbs()
if(blind) blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
updateicon()
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
sql_report_cyborg_death(src)
return ..(gibbed)
..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.")
@@ -200,14 +200,6 @@
return
..()
/mob/living/silicon/robot/drone/death(gibbed)
if(module)
var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module
if(G) G.drop_item()
..(gibbed)
//DRONE MOVEMENT.
/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip)
//TODO: Consider making a magboot item for drones to equip. ~Z
+1 -34
View File
@@ -515,13 +515,6 @@ var/list/robot_verbs_default = list(
C.toggled = 1
src << "\red You enable [C.name]."
/mob/living/silicon/robot/blob_act()
if (stat != 2)
adjustBruteLoss(60)
updatehealth()
return 1
return 0
// this function shows information about the malf_ai gameplay type in the status screen
/mob/living/silicon/robot/show_malf_ai()
..()
@@ -575,29 +568,6 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/restrained()
return 0
/mob/living/silicon/robot/ex_act(severity)
if(!blinded)
flick("flash", flash)
switch(severity)
if(1.0)
if (stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
gib()
return
if(2.0)
if (stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
updatehealth()
/mob/living/silicon/robot/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [src] has been hit by [O]"), 1)
@@ -609,14 +579,11 @@ var/list/robot_verbs_default = list(
updatehealth()
return
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
if(prob(75) && Proj.damage > 0) spark_system.start()
return 2
/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if ((!( yes ) || now_pushing))
@@ -977,7 +944,7 @@ var/list/robot_verbs_default = list(
return 1
return 0
/mob/living/silicon/robot/proc/updateicon()
/mob/living/silicon/robot/updateicon()
overlays.Cut()
if(stat == 0)
+29 -2
View File
@@ -75,8 +75,14 @@
/mob/living/silicon/IsAdvancedToolUser()
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
/mob/living/silicon/blob_act()
if (src.stat != 2)
src.adjustBruteLoss(60)
src.updatehealth()
return 1
return 0
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage)
switch(Proj.damage_type)
@@ -86,7 +92,7 @@
adjustFireLoss(Proj.damage)
Proj.on_hit(src,2)
updatehealth()
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
@@ -251,3 +257,24 @@
return 1
return 0
/mob/living/silicon/ex_act(severity)
if(!blinded)
flick("flash", flash)
switch(severity)
if(1.0)
if (stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(!anchored)
gib()
if(2.0)
if (stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
updatehealth()
@@ -35,14 +35,10 @@
spell_list += new spell(src)
/mob/living/simple_animal/construct/death()
..()
new /obj/item/weapon/ectoplasm (src.loc)
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
M.show_message("\red [src] collapses in a shattered heap. ")
..(null,"collapses in a shattered heap.")
ghostize()
del src
return
/mob/living/simple_animal/construct/examine(mob/user)
..(user)
@@ -43,11 +43,8 @@
/mob/living/simple_animal/hostile/mimic/death()
..()
visible_message("\red <b>[src]</b> stops moving!")
del(src)
//
// Crate Mimic
//
@@ -158,8 +158,7 @@
walk(src,0)
/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
..()
..(null,"suddenly breaks apart.")
del(src)
/mob/living/simple_animal/hostile/retaliate/malf_drone/Del()
@@ -158,7 +158,5 @@
minbodytemp = 0
/mob/living/simple_animal/hostile/viscerator/death()
..()
visible_message("\red <b>[src]</b> is smashed into pieces!")
del src
return
..(null,"is smashed into pieces!")
del src
@@ -51,7 +51,6 @@
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
/mob/living/simple_animal/hostile/tree/death()
..()
visible_message("\red <b>[src]</b> is hacked into pieces!")
..(null,"is hacked into pieces!")
new /obj/item/stack/sheet/wood(loc)
del(src)
@@ -198,12 +198,10 @@
..()
/mob/living/simple_animal/gib()
if(icon_gib)
flick(icon_gib, src)
if(meat_amount && meat_type)
for(var/i = 0; i < meat_amount; i++)
new meat_type(src.loc)
..()
..(icon_gib,1)
/mob/living/simple_animal/emote(var/act, var/type, var/desc)
if(act)
+3
View File
@@ -1157,3 +1157,6 @@ mob/proc/yank_out_object()
return I
return 0
/mob/proc/updateicon()
return
+32 -32
View File
@@ -11,7 +11,7 @@ nanoui is used to open and update nano browser uis
#define STATUS_UPDATE 1 // ORANGE Visability
#define STATUS_DISABLED 0 // RED Visability
/datum/nanoui
/datum/nanoui
// the user who opened this ui
var/mob/user
// the object this ui "belongs" to
@@ -103,13 +103,13 @@ nanoui is used to open and update nano browser uis
add_script("libraries.min.js") // A JS file comprising of jQuery, doT.js and jQuery Timer libraries (compressed together)
add_script("nano_utility.js") // The NanoUtility JS, this is used to store utility functions.
add_script("nano_template.js") // The NanoTemplate JS, this is used to render templates.
add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state
add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from
add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState
add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state
add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from
add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState
add_script("nano_base_callbacks.js") // The NanoBaseCallbacks JS, this is used to set up (before and after update) callbacks which are common to all UIs
add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all UIs
add_stylesheet("shared.css") // this CSS sheet is common to all UIs
add_stylesheet("icons.css") // this CSS sheet is common to all UIs
add_stylesheet("icons.css") // this CSS sheet is common to all UIs
/**
* Set the current status (also known as visibility) of this ui.
@@ -127,7 +127,7 @@ nanoui is used to open and update nano browser uis
update()
else
status = state
if (push_update || status == 0)
if (push_update || status == 0)
push_data(null, 1) // Update the UI, force the update in case the status is 0, data is null so that previous data is used
/**
@@ -138,7 +138,7 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/update_status(var/push_update = 0)
if (istype(user, /mob/living/silicon/ai))
if (istype(user, /mob/living/silicon/ai) || (get_dist(get_turf(user),get_turf(src_object)) <= 1))
set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility)
else if (istype(user, /mob/living/silicon/robot))
if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles
@@ -151,12 +151,12 @@ nanoui is used to open and update nano browser uis
if (dist > 4)
close()
return
if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat))
set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility)
else if (user.restrained() || user.lying)
set_status(STATUS_UPDATE, push_update) // update only (orange visibility)
else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI
else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI
set_status(STATUS_INTERACTIVE, push_update) // Will build in distance checks on the topics for sanity.
else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0
set_status(STATUS_DISABLED, push_update) // interactive (green visibility)
@@ -203,7 +203,7 @@ nanoui is used to open and update nano browser uis
"showMap" = show_map,
"mapZLevel" = map_z_level,
"user" = list("name" = user.name)
)
)
return config_data
/**
@@ -215,12 +215,12 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/get_send_data(var/list/data)
var/list/config_data = get_config_data()
var/list/send_data = list("config" = config_data)
if (!isnull(data))
send_data["data"] = data
return send_data
/**
@@ -267,11 +267,11 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/add_template(key, filename)
templates[key] = filename
/**
* Set the layout key for use in the frontend Javascript
* The layout key is the basic layout key for the page
* Two files are loaded on the client based on the layout key varable:
* Two files are loaded on the client based on the layout key varable:
* -> a template in /nano/templates with the filename "layout_<layout_key>.tmpl
* -> a CSS stylesheet in /nano/css with the filename "layout_<layout_key>.css
*
@@ -301,7 +301,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/set_auto_update_content(nstate)
auto_update_content = nstate
/**
* Set the state key for use in the frontend Javascript
*
@@ -310,8 +310,8 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/set_state_key(nstate_key)
state_key = nstate_key
state_key = nstate_key
/**
* Toggle showing the map ui
*
@@ -321,7 +321,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/set_show_map(nstate)
show_map = nstate
/**
* Toggle showing the map ui
*
@@ -352,15 +352,15 @@ nanoui is used to open and update nano browser uis
// before the UI opens, add the layout files based on the layout key
add_stylesheet("layout_[layout_key].css")
add_template("layout", "layout_[layout_key].tmpl")
var/head_content = ""
for (var/filename in scripts)
head_content += "<script type='text/javascript' src='[filename]'></script> "
for (var/filename in stylesheets)
head_content += "<link rel='stylesheet' type='text/css' href='[filename]'> "
var/template_data_json = "{}" // An empty JSON object
if (templates.len > 0)
template_data_json = list2json(templates)
@@ -378,7 +378,7 @@ nanoui is used to open and update nano browser uis
<script type='text/javascript'>
function receiveUpdateData(jsonString)
{
// We need both jQuery and NanoStateManager to be able to recieve data
// We need both jQuery and NanoStateManager to be able to recieve data
// At the moment any data received before those libraries are loaded will be lost
if (typeof NanoStateManager != 'undefined' && typeof jQuery != 'undefined')
{
@@ -388,7 +388,7 @@ nanoui is used to open and update nano browser uis
</script>
[head_content]
</head>
<body scroll=auto data-template-data='[template_data_json]' data-url-parameters='[url_parameters_json]' data-initial-data='[initial_data_json]'>
<body scroll=auto data-template-data='[template_data_json]' data-url-parameters='[url_parameters_json]' data-initial-data='[initial_data_json]'>
<div id='uiLayout'>
</div>
<noscript>
@@ -407,8 +407,8 @@ nanoui is used to open and update nano browser uis
*
* @return nothing
*/
/datum/nanoui/proc/open()
/datum/nanoui/proc/open()
var/window_size = ""
if (width && height)
window_size = "size=[width]x[height];"
@@ -453,7 +453,7 @@ nanoui is used to open and update nano browser uis
return // Cannot update UI, no visibility
var/list/send_data = get_send_data(data)
//user << list2json(data) // used for debugging
user << output(list2params(list(list2json(send_data))),"[window_id].browser:receiveUpdateData")
@@ -468,13 +468,13 @@ nanoui is used to open and update nano browser uis
update_status(0) // update the status
if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user
return
// This is used to toggle the nano map ui
var/map_update = 0
if(href_list["showMap"])
set_show_map(text2num(href_list["showMap"]))
map_update = 1
if(href_list["mapZLevel"])
set_map_z_level(text2num(href_list["mapZLevel"]))
map_update = 1
@@ -494,12 +494,12 @@ nanoui is used to open and update nano browser uis
if (!src_object || !user)
close()
return
if (status && (update || is_auto_updating))
update() // Update the UI (update_status() is called whenever a UI is updated)
else
update_status(1) // Not updating UI, so lets check here if status has changed
/**
* Update the UI
*
+3 -3
View File
@@ -1429,7 +1429,7 @@ datum/design/implant_loyal
req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 7000, "$glass" = 7000)
build_path = /obj/item/weapon/implant/loyalty"
build_path = /obj/item/weapon/implantcase/loyalty"
*/
datum/design/implant_chem
@@ -1439,7 +1439,7 @@ datum/design/implant_chem
req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = /obj/item/weapon/implant/chem
build_path = /obj/item/weapon/implantcase/chem
datum/design/implant_free
name = "freedom implant"
@@ -1448,7 +1448,7 @@ datum/design/implant_free
req_tech = list("syndicate" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = /obj/item/weapon/implant/freedom
build_path = /obj/item/weapon/implantcase/freedom
datum/design/chameleon
name = "Chameleon Kit"
+1
View File
@@ -21,6 +21,7 @@
if (moving_status == SHUTTLE_IDLE)
return //someone cancelled the launch
moving_status = SHUTTLE_INTRANSIT //shouldn't matter but just to be safe
move(origin, destination)
moving_status = SHUTTLE_IDLE
+1 -1
View File
@@ -39,7 +39,7 @@
shuttle_status = "Standing-by at station."
else
shuttle_status = "Standing-by at offsite location."
if(WAIT_LAUNCH)
if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
+2 -2
View File
@@ -46,7 +46,7 @@
//initiating or cancelling a launch ALWAYS requires authorization, but if we are already set to launch anyways than forcing does not.
//this is so that people can force launch if the docking controller cannot safely undock without needing X heads to swipe.
if (process_state != WAIT_LAUNCH && !C.has_authorization())
if (!(process_state == WAIT_LAUNCH || C.has_authorization()))
return 0
return ..()
@@ -175,7 +175,7 @@
shuttle_status = "Standing-by at [station_name]."
else
shuttle_status = "Standing-by at Central Command."
if(WAIT_LAUNCH)
if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
+17 -13
View File
@@ -1,7 +1,3 @@
#define IDLE_STATE 0
#define WAIT_LAUNCH 1
#define WAIT_ARRIVE 2
#define WAIT_FINISH 3
#define DOCK_ATTEMPT_TIMEOUT 200 //how long in ticks we wait before assuming the docking controller is broken or blown up.
@@ -68,6 +64,10 @@
return area_station
return area_offsite
/*
Please ensure that long_jump() and short_jump() are only called from here. This applies to subtypes as well.
Doing so will ensure that multiple jumps cannot be initiated in parallel.
*/
/datum/shuttle/ferry/proc/process()
switch(process_state)
if (WAIT_LAUNCH)
@@ -80,11 +80,21 @@
short_jump()
process_state = WAIT_ARRIVE
if (FORCE_LAUNCH)
if (move_time && area_transition)
long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction)
else
short_jump()
process_state = WAIT_ARRIVE
if (WAIT_ARRIVE)
if (moving_status == SHUTTLE_IDLE)
dock()
in_use = null //release lock
process_state = WAIT_FINISH
if (WAIT_FINISH)
if (skip_docking_checks() || docking_controller.docked() || world.time > last_dock_attempt_time + DOCK_ATTEMPT_TIMEOUT)
process_state = IDLE_STATE
@@ -112,13 +122,7 @@
in_use = user //obtain an exclusive lock on the shuttle
if (move_time && area_transition)
long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction)
else
short_jump()
process_state = WAIT_ARRIVE
process_state = FORCE_LAUNCH
/datum/shuttle/ferry/proc/cancel_launch(var/user)
if (!can_cancel()) return
@@ -150,13 +154,13 @@
return 0
/datum/shuttle/ferry/proc/can_cancel()
if (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH)
if (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH || process_state == FORCE_LAUNCH)
return 1
return 0
//returns 1 if the shuttle is getting ready to move, but is not in transit yet
/datum/shuttle/ferry/proc/is_launching()
return (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH)
return (moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH || process_state == FORCE_LAUNCH)
//This gets called when the shuttle finishes arriving at it's destination
//This can be used by subtypes to do things when the shuttle arrives.
+1 -1
View File
@@ -112,7 +112,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/datum/organ/external/affected = target.get_organ(target_zone)
return !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
return !istype(user,/mob/living/silicon/robot) && !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)