mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 02:54:41 +01:00
Merge Conflic Fix
Conflicts: icons/obj/gun.dmi
This commit is contained in:
@@ -144,7 +144,8 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/toggledebuglogs,
|
||||
/client/proc/qdel_toggle // /vg/
|
||||
/client/proc/qdel_toggle, // /vg/
|
||||
/client/proc/gc_dump_hdl
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
if(check_rights(R_ADMIN, 0))
|
||||
spanclass = "mod_channel_admin"
|
||||
for(var/client/C in admins)
|
||||
C << "<span class='[spanclass]'>MOD: <span class='name'>[key_name(usr, 1)]</span> (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
|
||||
if(R_MOD & C.holder.rights)
|
||||
C << "<span class='[spanclass]'>MOD: <span class='name'>[key_name(usr, 1)]</span> (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
|
||||
|
||||
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -335,4 +335,12 @@
|
||||
icon_state = "shamebrero"
|
||||
item_state = "shamebrero"
|
||||
desc = "Once it's on, it never comes off."
|
||||
flags = NODROP
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/head/griffin
|
||||
name = "griffon head"
|
||||
desc = "Why not 'eagle head'? Who knows."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
flags = BLOCKHAIR|NODROP
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
@@ -135,6 +135,7 @@
|
||||
desc = "Twoooo!"
|
||||
icon_state = "owl"
|
||||
species_fit = list("Vox")
|
||||
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | NODROP
|
||||
|
||||
|
||||
// ********************************************************************
|
||||
|
||||
@@ -150,4 +150,11 @@
|
||||
/obj/item/clothing/shoes/centcom
|
||||
name = "dress shoes"
|
||||
desc = "They appear impeccably polished."
|
||||
icon_state = "laceups"
|
||||
icon_state = "laceups"
|
||||
|
||||
/obj/item/clothing/shoes/griffin
|
||||
name = "griffon boots"
|
||||
desc = "A pair of costume boots fashioned after bird talons."
|
||||
icon_state = "griffinboots"
|
||||
item_state = "griffinboots"
|
||||
flags = NODROP
|
||||
@@ -444,3 +444,30 @@
|
||||
desc = "An overcoat for the clown soldier, to keep him warm during those cold winter nights on the front."
|
||||
icon_state = "soldiersuit"
|
||||
item_state = "soldiersuit"
|
||||
|
||||
/obj/item/clothing/suit/toggle/owlwings
|
||||
name = "owl cloak"
|
||||
desc = "A soft brown cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive the ladies mad."
|
||||
icon_state = "owl_wings"
|
||||
item_state = "owl_wings"
|
||||
body_parts_covered = ARMS
|
||||
armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite)
|
||||
action_button_name = "Toggle Owl Wings"
|
||||
icon_action_button = "action_wings"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/suit/toggle/owlwings/griffinwings
|
||||
name = "griffon cloak"
|
||||
desc = "A plush white cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive your captives mad."
|
||||
icon_state = "griffin_wings"
|
||||
item_state = "griffin_wings"
|
||||
|
||||
/obj/item/clothing/suit/toggle/attack_self()
|
||||
if(icon_state == initial(icon_state))
|
||||
icon_state = icon_state + "_t"
|
||||
item_state = icon_state + "_t"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
usr.update_inv_wear_suit()
|
||||
@@ -140,12 +140,6 @@
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/under/owl
|
||||
name = "owl uniform"
|
||||
desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!"
|
||||
icon_state = "owl"
|
||||
_color = "owl"
|
||||
|
||||
/obj/item/clothing/under/johnny
|
||||
name = "johnny~~ jumpsuit"
|
||||
desc = "Johnny~~"
|
||||
@@ -643,4 +637,20 @@
|
||||
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
|
||||
icon_state = "checkered_suit"
|
||||
item_state = "checkered_suit"
|
||||
_color = "checkered_suit"
|
||||
_color = "checkered_suit"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/under/owl
|
||||
name = "owl uniform"
|
||||
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
|
||||
icon_state = "owl"
|
||||
_color = "owl"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/under/griffin
|
||||
name = "griffon uniform"
|
||||
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
|
||||
icon_state = "griffin"
|
||||
_color = "griffin"
|
||||
flags = NODROP
|
||||
@@ -46,6 +46,12 @@
|
||||
desc = "Dark Green beret with an old insignia on it."
|
||||
icon_state = "sparkyninja_beret"
|
||||
|
||||
/obj/item/weapon/book/manual/security_space_law/black
|
||||
name = "Space Law - Limited Edition"
|
||||
desc = "A leather-bound, immaculately-written copy of JUSTICE."
|
||||
icon_state = "bookSpaceLawblack"
|
||||
title = "Space Law - Limited Edition"
|
||||
|
||||
//////////////////////////////////
|
||||
////////// Fluff Items ///////////
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
#define EMOTE_COOLDOWN 50 //Time in deciseconds that the cooldown lasts
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
/mob/proc/handle_emote_CD()
|
||||
if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use
|
||||
if(src.emote_cd == 1) return 1 // Already on CD, prevent use
|
||||
|
||||
src.emote_cd = 1 // Starting cooldown
|
||||
spawn(EMOTE_COOLDOWN)
|
||||
if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown
|
||||
src.emote_cd = 0 // Cooldown complete, ready for more!
|
||||
|
||||
return 0 // Proceed with emote
|
||||
//--FalseIncarnate
|
||||
|
||||
// All mobs should have custom emote, really..
|
||||
/mob/proc/custom_emote(var/m_type=1,var/message = null)
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
var/native // If set, non-native speakers will have trouble speaking.
|
||||
var/list/syllables // Used when scrambling text for a non-speaker.
|
||||
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string.
|
||||
var/follow = 0 // Applies to HIVEMIND languages - should a follow link be included for dead mobs?
|
||||
|
||||
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
|
||||
if(!syllables || !syllables.len)
|
||||
@@ -102,7 +103,12 @@
|
||||
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
|
||||
|
||||
for(var/mob/player in player_list)
|
||||
if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player)))
|
||||
if(istype(player,/mob/dead) && follow)
|
||||
var/msg_dead = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> (<a href='byond://?src=\ref[player];follow2=\ref[player];follow=\ref[speaker]'>follow</a>) [format_message(message, get_spoken_verb(message))]</span></i>"
|
||||
player << msg_dead
|
||||
continue
|
||||
|
||||
else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player)))
|
||||
player << msg
|
||||
|
||||
/datum/language/proc/check_special_condition(var/mob/other)
|
||||
@@ -340,12 +346,7 @@
|
||||
colour = "alien"
|
||||
key = "a"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/xenos/check_special_condition(var/mob/other)
|
||||
var/mob/living/carbon/M = other
|
||||
if(!istype(M))
|
||||
return 1
|
||||
return 0
|
||||
follow = 1
|
||||
|
||||
/datum/language/ling
|
||||
name = "Changeling"
|
||||
@@ -395,6 +396,7 @@
|
||||
exclaim_verb = "declares"
|
||||
key = "b"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
follow = 1
|
||||
var/drone_only
|
||||
|
||||
/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
@@ -409,8 +411,9 @@
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i>"
|
||||
|
||||
for (var/mob/M in dead_mob_list)
|
||||
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
|
||||
M.show_message("[message_start] [message_body]", 2)
|
||||
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
|
||||
var/message_start_dead = "<i><span class='game say'>[name], <span class='name'>[speaker.name] (<a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[speaker]'>follow</a>)</span>"
|
||||
M.show_message("[message_start_dead] [message_body]", 2)
|
||||
|
||||
for (var/mob/living/S in living_mob_list)
|
||||
|
||||
@@ -447,6 +450,7 @@
|
||||
key = "d"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
drone_only = 1
|
||||
follow = 1
|
||||
|
||||
// Language handling.
|
||||
/mob/proc/add_language(var/language)
|
||||
|
||||
@@ -88,12 +88,14 @@
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/throw_impact(A)
|
||||
var/msg = ""
|
||||
|
||||
if(!leaping)
|
||||
return ..()
|
||||
|
||||
if(A)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/L = A
|
||||
msg = "<span class ='alertalien'>[src] pounces on [A]!</span>"
|
||||
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
|
||||
L.Weaken(5)
|
||||
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
|
||||
step_towards(src,L)
|
||||
@@ -103,13 +105,12 @@
|
||||
spawn(pounce_cooldown_time) //3s by default
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
else
|
||||
msg = "<span class ='alertalien'>[src] smashes into [A]!</span>"
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='alertalien'>[src] smashes into [A]!</span>")
|
||||
weakened = 2
|
||||
|
||||
if(leaping)
|
||||
leaping = 0
|
||||
update_canmove()
|
||||
visible_message(msg)
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/float(on)
|
||||
@@ -157,7 +158,5 @@
|
||||
|
||||
|
||||
src.throwing = 0
|
||||
if(isobj(src))
|
||||
src.throw_impact(get_turf(src))
|
||||
|
||||
return 1
|
||||
@@ -22,7 +22,7 @@
|
||||
name = text("alien ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
add_language("Xenomorph")
|
||||
add_language("Hivemind")
|
||||
add_language("Hivemind")
|
||||
..()
|
||||
|
||||
//This is fine, works the same as a human
|
||||
@@ -65,7 +65,7 @@
|
||||
return (tally + move_delay_add + config.alien_delay)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
///mob/living/carbon/alien/humanoid/bullet_act(var/obj/item/projectile/Proj) taken care of in living
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
show_message("<span class='userdanger'>The blob attacks!</span>")
|
||||
adjustFireLoss(damage)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/meteorhit(O as obj)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
@@ -271,7 +271,7 @@
|
||||
if (HULK in M.mutations)//HULK SMASH
|
||||
damage += 14
|
||||
spawn(0)
|
||||
Weaken(damage) // Why can a hulk knock an alien out but not knock out a human? Damage is robust enough.
|
||||
Paralyse(1)
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
@@ -279,7 +279,7 @@
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 9||prob(5)))//Regular humans have a very small chance of weakening an alien.
|
||||
Weaken(1,5)
|
||||
Paralyse(2)
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='danger'>You hear someone fall.</span>")
|
||||
@@ -292,7 +292,7 @@
|
||||
if ("disarm")
|
||||
if (!lying)
|
||||
if (prob(5))//Very small chance to push an alien down.
|
||||
Weaken(2)
|
||||
Paralyse(2)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
@@ -399,4 +399,4 @@ In all, this is a lot like the monkey code. /N
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/canBeHandcuffed()
|
||||
return 1
|
||||
return 1
|
||||
@@ -24,7 +24,7 @@
|
||||
real_name = name
|
||||
regenerate_icons()
|
||||
add_language("Xenomorph")
|
||||
add_language("Hivemind")
|
||||
add_language("Hivemind")
|
||||
..()
|
||||
|
||||
//This is fine, works the same as a human
|
||||
@@ -128,7 +128,7 @@
|
||||
//can't equip anything
|
||||
/mob/living/carbon/alien/larva/attack_ui(slot_id)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/meteorhit(O as obj)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
@@ -254,7 +254,7 @@
|
||||
visible_message("<span class='danger'>[M] has kicked [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has kicked [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 4.9))
|
||||
Weaken(rand(5,10))
|
||||
Paralyse(rand(5,10))
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='danger'>You hear someone fall.</span>")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/mob/living/carbon/alien/proc/handle_chemicals_in_body()
|
||||
if(reagents) reagents.metabolize(src)
|
||||
if(reagents)
|
||||
reagents.metabolize(src)
|
||||
|
||||
if (drowsyness)
|
||||
drowsyness--
|
||||
|
||||
@@ -16,9 +16,20 @@
|
||||
return emote(copytext(message,2))
|
||||
|
||||
var/datum/language/speaking = parse_language(message)
|
||||
|
||||
if(speaking)
|
||||
message = copytext(message, 2+length(speaking.key))
|
||||
message = copytext(message,2+length(speaking.key))
|
||||
else
|
||||
speaking = all_languages["Xenomorph"]
|
||||
|
||||
var/ending = copytext(message, length(message))
|
||||
if (speaking)
|
||||
// This is broadcast to all mobs with the language,
|
||||
// irrespective of distance or anything else.
|
||||
if(speaking.flags & HIVEMIND)
|
||||
speaking.broadcast(src,trim(message))
|
||||
return
|
||||
//If we've gotten this far, keep going!
|
||||
verb = speaking.get_spoken_verb(ending)
|
||||
|
||||
message = trim(message)
|
||||
|
||||
|
||||
@@ -78,7 +78,10 @@
|
||||
|
||||
|
||||
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE) //godmode
|
||||
return 0
|
||||
if(NO_SHOCK in mutations) //shockproof
|
||||
return 0
|
||||
shock_damage *= siemens_coeff
|
||||
if (shock_damage<1)
|
||||
return 0
|
||||
@@ -99,8 +102,14 @@
|
||||
"\red <B>You feel a powerful shock course through your body!</B>", \
|
||||
"\red You hear a heavy electrical crack." \
|
||||
)
|
||||
Stun(10)//This should work for now, more is really silly and makes you lay there forever
|
||||
Weaken(10)
|
||||
jitteriness += 1000 //High numbers for violent convulsions
|
||||
do_jitter_animation(jitteriness)
|
||||
stuttering += 2
|
||||
Stun(2)
|
||||
spawn(20)
|
||||
jitteriness -= 990 //Still jittery, but vastly less
|
||||
Stun(3)
|
||||
Weaken(3)
|
||||
if (shock_damage > 200)
|
||||
src.visible_message(
|
||||
"\red [src] was arc flashed by the [source]!", \
|
||||
@@ -588,6 +597,6 @@
|
||||
|
||||
/mob/living/carbon/proc/canBeHandcuffed()
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/is_muzzled()
|
||||
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
|
||||
@@ -20,69 +20,100 @@
|
||||
|
||||
if(src.stat == 2.0 && (act != "deathgasp"))
|
||||
return
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("ping","buzz","beep")
|
||||
if (species.name == "Machine") //Only Machines can beep, ping, and buzz
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("squish")
|
||||
if(species.name == "Slime People") //Only Slime People can squish
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("scream", "fart", "flip")
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
//Everything else, including typos of the above emotes
|
||||
else
|
||||
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
|
||||
|
||||
if(on_CD == 1) // Check if we need to suppress the emote attempt.
|
||||
return // Suppress emote, you're still cooling off.
|
||||
//--FalseIncarnate
|
||||
|
||||
switch(act)
|
||||
if("ping")
|
||||
if (species.name == "Machine")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
|
||||
if (param)
|
||||
message = "<B>[src]</B> pings at [param]."
|
||||
else
|
||||
message = "<B>[src]</B> pings."
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
m_type = 1
|
||||
if (param)
|
||||
message = "<B>[src]</B> pings at [param]."
|
||||
else
|
||||
if (!species.name == "Machine")
|
||||
return
|
||||
message = "<B>[src]</B> pings."
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
m_type = 1
|
||||
|
||||
if("buzz")
|
||||
if (species.name == "Machine")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
|
||||
if (param)
|
||||
message = "<B>[src]</B> buzzes at [param]."
|
||||
else
|
||||
message = "<B>[src]</B> buzzes."
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
m_type = 1
|
||||
if (param)
|
||||
message = "<B>[src]</B> buzzes at [param]."
|
||||
else
|
||||
if (!species.name == "Machine")
|
||||
return
|
||||
message = "<B>[src]</B> buzzes."
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
m_type = 1
|
||||
|
||||
if("beep")
|
||||
if(species.name == "Machine")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
|
||||
if (param)
|
||||
message = "<B>[src]</B> beeps at [param]."
|
||||
else
|
||||
message = "<B>[src]</B> beeps."
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
m_type = 1
|
||||
if (param)
|
||||
message = "<B>[src]</B> beeps at [param]."
|
||||
else
|
||||
if (!species.name == "Machine")
|
||||
return
|
||||
message = "<B>[src]</B> beeps."
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
m_type = 1
|
||||
|
||||
if("squish")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
|
||||
if (param)
|
||||
message = "<B>[src]</B> squishes at [param]."
|
||||
else
|
||||
message = "<B>[src]</B> squishes."
|
||||
playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
|
||||
m_type = 1
|
||||
|
||||
if("wag")
|
||||
if(species.bodyflags & TAIL_WAGGING)
|
||||
@@ -204,6 +235,31 @@
|
||||
if(miming)
|
||||
m_type = 1
|
||||
|
||||
if ("flip")
|
||||
m_type = 1
|
||||
if (!src.restrained())
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if (M == src)
|
||||
M = null
|
||||
|
||||
if (M)
|
||||
if(src.lying || src.weakened)
|
||||
message = "<B>[src]</B> flops and flails around on the floor."
|
||||
else
|
||||
message = "<B>[src]</B> flips in [M]'s general direction."
|
||||
src.SpinAnimation(5,1)
|
||||
else
|
||||
if(src.lying || src.weakened)
|
||||
message = "<B>[src]</B> flops and flails around on the floor."
|
||||
else
|
||||
message = "<B>[src]</B> does a flip!"
|
||||
src.SpinAnimation(5,1)
|
||||
|
||||
if ("aflap")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps his wings ANGRILY!"
|
||||
|
||||
@@ -403,7 +403,7 @@
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(L.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
|
||||
for(var/L in M.contents)
|
||||
@@ -636,7 +636,10 @@
|
||||
//Removed the horrible safety parameter. It was only being used by ninja code anyways.
|
||||
//Now checks siemens_coefficient of the affected area by default
|
||||
/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE) //godmode
|
||||
return 0
|
||||
if(NO_SHOCK in mutations) //shockproof
|
||||
return 0
|
||||
|
||||
if (!def_zone)
|
||||
def_zone = pick("l_hand", "r_hand")
|
||||
|
||||
@@ -32,7 +32,9 @@
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(HULK in M.mutations) damage += 5
|
||||
if(HULK in M.mutations)
|
||||
damage += 5
|
||||
Weaken(4)
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
@@ -139,8 +141,9 @@
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(HULK in M.mutations) damage += 5
|
||||
|
||||
if(HULK in M.mutations)
|
||||
damage += 5
|
||||
Weaken(4)
|
||||
|
||||
playsound(loc, attack.attack_sound, 25, 1, -1)
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
timeofdeath = 0
|
||||
|
||||
/mob/living/carbon/human/getBrainLoss()
|
||||
if(species && species.flags & NO_INTORGANS)
|
||||
if(species && species.flags & NO_INTORGANS)
|
||||
return
|
||||
var/res = brainloss
|
||||
var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -110,15 +110,12 @@
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
|
||||
/mob/living/carbon/human/Stun(amount)
|
||||
if(HULK in mutations) return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/Weaken(amount)
|
||||
if(HULK in mutations) return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/Paralyse(amount)
|
||||
if(HULK in mutations) return
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
|
||||
if(life_tick%30==15)
|
||||
hud_updateflag = 1022
|
||||
|
||||
|
||||
voice = GetVoice()
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
@@ -632,8 +632,20 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
handle_fire()
|
||||
if(..())
|
||||
return
|
||||
var/thermal_protection = get_heat_protection(10000) //If you don't have fire suit level protection, you get a temperature increase
|
||||
if((1 - thermal_protection) > 0.0001)
|
||||
var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures
|
||||
if(wear_suit)
|
||||
if(wear_suit.max_heat_protection_temperature >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE)
|
||||
thermal_protection += (wear_suit.max_heat_protection_temperature*0.7)
|
||||
if(head)
|
||||
if(head.max_heat_protection_temperature >= FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE)
|
||||
thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD)
|
||||
thermal_protection = round(thermal_protection)
|
||||
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
|
||||
return
|
||||
if(thermal_protection >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE)
|
||||
bodytemperature += 11
|
||||
return
|
||||
else
|
||||
bodytemperature += BODYTEMP_HEATING_MAX
|
||||
return
|
||||
//END FIRE CODE
|
||||
@@ -914,10 +926,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
traumatic_shock -= light_amount
|
||||
|
||||
if(species.flags & IS_PLANT)
|
||||
if(nutrition > 500)
|
||||
nutrition = 500
|
||||
if(nutrition > 450)
|
||||
nutrition = 450
|
||||
if(light_amount >= 5) //if there's enough light, heal
|
||||
adjustBruteLoss(-(light_amount))
|
||||
adjustBruteLoss(-(light_amount/2))
|
||||
adjustFireLoss(-(light_amount/4))
|
||||
//adjustToxLoss(-(light_amount))
|
||||
adjustOxyLoss(-(light_amount))
|
||||
//TODO: heal wounds, heal broken limbs.
|
||||
|
||||
@@ -1165,13 +1179,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
|
||||
//Jitteryness
|
||||
if(jitteriness)
|
||||
var/amplitude = min(4, (jitteriness/100) + 1)
|
||||
var/pixel_x_diff = rand(-amplitude, amplitude)
|
||||
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
|
||||
jitteriness = max(jitteriness-1, 0)
|
||||
do_jitter_animation(jitteriness)
|
||||
|
||||
//Other
|
||||
handle_statuses()
|
||||
@@ -1926,7 +1934,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
var/client/C = client
|
||||
for(var/mob/living/carbon/human/H in view(src, 14))
|
||||
C.images += H.hud_list[NATIONS_HUD]
|
||||
|
||||
|
||||
/mob/living/carbon/human/handle_silent()
|
||||
if(..())
|
||||
speech_problem_flag = 1
|
||||
|
||||
@@ -420,7 +420,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
return
|
||||
|
||||
//masks and helmets can obscure our hair, unless we're a synthetic
|
||||
if(!(species.flags & IS_SYNTHETIC) && (head && (head.flags & BLOCKHAIR)) || !(species.flags & IS_SYNTHETIC) && (wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||
if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||
if(update_icons) update_icons()
|
||||
return
|
||||
|
||||
|
||||
@@ -11,6 +11,24 @@
|
||||
|
||||
var/muzzled = is_muzzled()
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("chirp")
|
||||
if(istype(src,/mob/living/carbon/monkey/diona)) //Only Diona Nymphs can chirp
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
//Everything else, including typos of the above emotes
|
||||
else
|
||||
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
|
||||
|
||||
if(on_CD == 1) // Check if we need to suppress the emote attempt.
|
||||
return // Suppress emote, you're still cooling off.
|
||||
//--FalseIncarnate
|
||||
|
||||
switch(act)
|
||||
if ("me")
|
||||
if(silent)
|
||||
@@ -32,10 +50,9 @@
|
||||
return custom_emote(m_type, message)
|
||||
|
||||
if ("chirp")
|
||||
if(istype(src,/mob/living/carbon/monkey/diona))
|
||||
message = "<B>The [src.name]</B> chirps!"
|
||||
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
|
||||
m_type = 2
|
||||
message = "<B>The [src.name]</B> chirps!"
|
||||
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
|
||||
m_type = 2
|
||||
if("sign")
|
||||
if (!src.restrained())
|
||||
message = text("<B>The monkey</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
|
||||
|
||||
@@ -121,7 +121,10 @@
|
||||
|
||||
if ((HULK in mutations) && health <= 25)
|
||||
mutations.Remove(HULK)
|
||||
src << "\red You suddenly feel very weak."
|
||||
dna.SetSEState(HULKBLOCK,0)
|
||||
update_mutations() //update our mutation overlays
|
||||
status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved.
|
||||
src << "<span class='danger'>You suddenly feel very weak.</span>"
|
||||
Weaken(3)
|
||||
emote("collapse")
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && (HULK in tmob.mutations))
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(70))
|
||||
usr << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
@@ -188,8 +188,8 @@
|
||||
if ((O.icon_state == "flaming" && !( shielded )))
|
||||
adjustFireLoss(40)
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/attack_paw(mob/living/M as mob)
|
||||
..()
|
||||
|
||||
@@ -434,7 +434,7 @@
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/mob/living/carbon/monkey/say(var/message)
|
||||
var/verb = "says"
|
||||
var/message_range = world.view
|
||||
|
||||
if(client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "\red You cannot speak in IC (Muted)."
|
||||
return
|
||||
|
||||
message = trim_strip_html_properly(message)
|
||||
|
||||
if(stat == 2)
|
||||
return say_dead(message)
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
|
||||
var/datum/language/speaking = parse_language(message)
|
||||
|
||||
if(speaking)
|
||||
message = copytext(message, 2+length(speaking.key))
|
||||
|
||||
message = trim(message)
|
||||
|
||||
if(!message || stat)
|
||||
return
|
||||
|
||||
..(message, speaking, verb, null, null, message_range, null)
|
||||
@@ -58,6 +58,8 @@
|
||||
halloss += effect // Useful for objects that cause "subdual" damage. PAIN!
|
||||
if(IRRADIATE)
|
||||
radiation += max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)//Rads auto check armor
|
||||
if(SLUR)
|
||||
slurring = max(slurring,(effect * blocked))
|
||||
if(STUTTER)
|
||||
if(status_flags & CANSTUN) // stun is usually associated with stutter
|
||||
stuttering = max(stuttering,(effect * blocked))
|
||||
@@ -66,7 +68,8 @@
|
||||
if(DROWSY)
|
||||
drowsyness = max(drowsyness,(effect * blocked))
|
||||
if(JITTER)
|
||||
jitteriness = max(jitteriness,(effect * blocked))
|
||||
if(status_flags & CANSTUN)
|
||||
jitteriness = max(jitteriness,(effect * blocked))
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
@@ -80,12 +83,13 @@
|
||||
/mob/living/carbon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0, var/stamina = 0, var/jitter = 0)
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/slur = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0, var/stamina = 0, var/jitter = 0)
|
||||
if(blocked >= 100) return 0
|
||||
if(stun) apply_effect(stun, STUN, blocked)
|
||||
if(weaken) apply_effect(weaken, WEAKEN, blocked)
|
||||
if(paralyze) apply_effect(paralyze, PARALYZE, blocked)
|
||||
if(irradiate) apply_effect(irradiate, IRRADIATE, blocked)
|
||||
if(slur) apply_effect(slur, SLUR, blocked)
|
||||
if(stutter) apply_effect(stutter, STUTTER, blocked)
|
||||
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
|
||||
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
/mob/living/proc/burn_skin(burn_amount)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
//world << "DEBUG: burn_skin(), mutations=[mutations]"
|
||||
if(NO_SHOCK in src.mutations) //shockproof
|
||||
return 0
|
||||
if (RESIST_HEAT in src.mutations) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||
@@ -629,7 +627,8 @@
|
||||
var/mob/living/carbon/CM = L
|
||||
if(CM.on_fire && CM.canmove)
|
||||
CM.fire_stacks -= 5
|
||||
CM.Weaken(3)
|
||||
CM.weakened = max(CM.weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
|
||||
CM.update_canmove()
|
||||
CM.spin(32,2)
|
||||
CM.visible_message("<span class='danger'>[CM] rolls on the floor, trying to put themselves out!</span>", \
|
||||
"<span class='notice'>You stop, drop, and roll!</span>")
|
||||
@@ -761,7 +760,7 @@
|
||||
|
||||
/mob/living/proc/can_use_vents()
|
||||
return "You can't fit into that vent."
|
||||
|
||||
|
||||
|
||||
|
||||
/atom/movable/proc/do_attack_animation(atom/A)
|
||||
@@ -791,3 +790,15 @@
|
||||
pixel_y_diff = -8
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
|
||||
animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
|
||||
|
||||
/mob/living/do_attack_animation(atom/A)
|
||||
..()
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
|
||||
/mob/living/proc/do_jitter_animation(jitteriness)
|
||||
var/amplitude = min(4, (jitteriness/100) + 1)
|
||||
var/pixel_x_diff = rand(-amplitude, amplitude)
|
||||
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
|
||||
@@ -223,19 +223,21 @@
|
||||
/mob/living/proc/IgniteMob()
|
||||
if(fire_stacks > 0)
|
||||
on_fire = 1
|
||||
src.AddLuminosity(3)
|
||||
update_fire()
|
||||
|
||||
/mob/living/proc/ExtinguishMob()
|
||||
if(on_fire)
|
||||
on_fire = 0
|
||||
fire_stacks = 0
|
||||
src.AddLuminosity(-3)
|
||||
update_fire()
|
||||
|
||||
/mob/living/proc/update_fire()
|
||||
return
|
||||
|
||||
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
|
||||
fire_stacks = Clamp(fire_stacks + add_fire_stacks, min = -20, max = 20)
|
||||
fire_stacks = Clamp(fire_stacks + add_fire_stacks, min = -20, max = 20)
|
||||
|
||||
/mob/living/proc/handle_fire()
|
||||
if(fire_stacks < 0)
|
||||
@@ -243,25 +245,15 @@
|
||||
fire_stacks = min(0, fire_stacks)//So we dry ourselves back to default, nonflammable.
|
||||
if(!on_fire)
|
||||
return 1
|
||||
|
||||
var/oxy=0
|
||||
var/turf/T=loc
|
||||
if(istype(T))
|
||||
if(istype(T,/turf/space))
|
||||
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
|
||||
return 1
|
||||
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
|
||||
if(G)
|
||||
oxy=G.oxygen
|
||||
if(oxy < 10 || fire_stacks <= 0)
|
||||
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
|
||||
if(G.oxygen < 1)
|
||||
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
|
||||
return 1
|
||||
return
|
||||
var/turf/location = get_turf(src)
|
||||
location.hotspot_expose(700, 50, 1)
|
||||
|
||||
/mob/living/fire_act()
|
||||
adjust_fire_stacks(5)
|
||||
if(fire_stacks > 9 && !on_fire)
|
||||
IgniteMob()
|
||||
adjust_fire_stacks(0.5)
|
||||
IgniteMob()
|
||||
|
||||
//Mobs on Fire end
|
||||
|
||||
@@ -2,6 +2,32 @@
|
||||
#define AI_CHECK_RADIO 2
|
||||
|
||||
var/list/ai_list = list()
|
||||
var/list/ai_verbs_default = list(
|
||||
/mob/living/silicon/ai/proc/ai_alerts,
|
||||
/mob/living/silicon/ai/proc/announcement,
|
||||
/mob/living/silicon/ai/proc/ai_call_shuttle,
|
||||
/mob/living/silicon/ai/proc/ai_cancel_call,
|
||||
/mob/living/silicon/ai/proc/ai_camera_track,
|
||||
/mob/living/silicon/ai/proc/ai_camera_list,
|
||||
/mob/living/silicon/ai/proc/ai_goto_location,
|
||||
/mob/living/silicon/ai/proc/ai_remove_location,
|
||||
/mob/living/silicon/ai/proc/ai_hologram_change,
|
||||
/mob/living/silicon/ai/proc/ai_network_change,
|
||||
/mob/living/silicon/ai/proc/ai_roster,
|
||||
/mob/living/silicon/ai/proc/ai_statuschange,
|
||||
/mob/living/silicon/ai/proc/ai_store_location,
|
||||
/mob/living/silicon/ai/proc/checklaws,
|
||||
/mob/living/silicon/ai/proc/control_integrated_radio,
|
||||
/mob/living/silicon/ai/proc/core,
|
||||
/mob/living/silicon/ai/proc/pick_icon,
|
||||
/mob/living/silicon/ai/proc/sensor_mode,
|
||||
/mob/living/silicon/ai/proc/show_laws_verb,
|
||||
/mob/living/silicon/ai/proc/toggle_acceleration,
|
||||
/mob/living/silicon/ai/proc/toggle_camera_light,
|
||||
/mob/living/silicon/ai/proc/botcall,
|
||||
/mob/living/silicon/ai/proc/change_arrival_message,
|
||||
/mob/living/silicon/ai/proc/nano_crew_monitor
|
||||
)
|
||||
|
||||
//Not sure why this is necessary...
|
||||
/proc/AutoUpdateAI(obj/subject)
|
||||
@@ -14,7 +40,6 @@ var/list/ai_list = list()
|
||||
subject.attack_ai(M)
|
||||
return is_in_use
|
||||
|
||||
|
||||
/mob/living/silicon/ai
|
||||
name = "AI"
|
||||
icon = 'icons/mob/AI.dmi'//
|
||||
@@ -69,6 +94,12 @@ var/list/ai_list = list()
|
||||
|
||||
var/arrivalmsg = "$name, $rank, has arrived on the station."
|
||||
|
||||
/mob/living/silicon/ai/proc/add_ai_verbs()
|
||||
src.verbs |= ai_verbs_default
|
||||
|
||||
/mob/living/silicon/ai/proc/remove_ai_verbs()
|
||||
src.verbs -= ai_verbs_default
|
||||
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
var/list/possibleNames = ai_names
|
||||
|
||||
@@ -101,22 +132,20 @@ var/list/ai_list = list()
|
||||
|
||||
aiMulti = new(src)
|
||||
aiRadio = new(src)
|
||||
common_radio = aiRadio
|
||||
aiRadio.myAi = src
|
||||
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
|
||||
|
||||
|
||||
|
||||
if (istype(loc, /turf))
|
||||
verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \
|
||||
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
|
||||
/mob/living/silicon/ai/proc/toggle_camera_light, /mob/living/silicon/ai/proc/botcall, /mob/living/silicon/ai/proc/control_integrated_radio, /mob/living/silicon/ai/proc/control_hud, /mob/living/silicon/ai/proc/change_arrival_message, /mob/living/silicon/ai/proc/ai_store_location, /mob/living/silicon/ai/proc/ai_goto_location, /mob/living/silicon/ai/proc/ai_remove_location, /mob/living/silicon/ai/proc/nano_crew_monitor, /mob/living/silicon/ai/proc/ai_cancel_call)
|
||||
add_ai_verbs(src)
|
||||
|
||||
//Languages
|
||||
add_language("Robot Talk", 1)
|
||||
add_language("Galactic Common", 1)
|
||||
add_language("Sol Common", 1)
|
||||
add_language("Tradeband", 1)
|
||||
add_language("Gutter", 0)
|
||||
add_language("Sinta'unathi", 0)
|
||||
add_language("Siik'tajr", 0)
|
||||
add_language("Skrellian", 0)
|
||||
@@ -125,37 +154,18 @@ var/list/ai_list = list()
|
||||
add_language("Trinary", 1)
|
||||
add_language("Chittin", 0)
|
||||
add_language("Bubblish", 0)
|
||||
add_language("Gutter", 0)
|
||||
add_language("Clownish", 0)
|
||||
|
||||
if(!safety)//Only used by AIize() to successfully spawn an AI.
|
||||
if (!B)//If there is no player/brain inside.
|
||||
empty_playable_ai_cores += new/obj/structure/AIcore/deactivated(loc)//New empty terminal.
|
||||
new/obj/structure/AIcore/deactivated(loc)//New empty terminal.
|
||||
del(src)//Delete AI.
|
||||
return
|
||||
else
|
||||
if (B.brainmob.mind)
|
||||
if(B.alien)
|
||||
B.brainmob.mind.transfer_to(src)
|
||||
icon_state = "ai-alien"
|
||||
verbs.Remove(,/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \
|
||||
/mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \
|
||||
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
|
||||
/mob/living/silicon/ai/proc/toggle_camera_light,/mob/living/silicon/ai/verb/pick_icon,/mob/living/silicon/ai/proc/control_hud, /mob/living/silicon/ai/proc/change_arrival_message, /mob/living/silicon/ai/proc/ai_cancel_call)
|
||||
laws = new /datum/ai_laws/alienmov
|
||||
add_language("xenocommon", 1)
|
||||
else
|
||||
B.brainmob.mind.transfer_to(src)
|
||||
B.brainmob.mind.transfer_to(src)
|
||||
|
||||
src << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
src << "<B>To look at other parts of the station, click on yourself to get a camera menu.</B>"
|
||||
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
src << "To use something, simply click on it."
|
||||
src << "Use say :b to speak to your cyborgs through binary."
|
||||
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
|
||||
show_laws()
|
||||
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
job = "AI"
|
||||
on_mob_init()
|
||||
|
||||
spawn(5)
|
||||
new /obj/machinery/ai_powersupply(src)
|
||||
@@ -177,6 +187,30 @@ var/list/ai_list = list()
|
||||
..()
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/proc/on_mob_init()
|
||||
src << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
src << "<B>To look at other parts of the station, click on yourself to get a camera menu.</B>"
|
||||
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
src << "To use something, simply click on it."
|
||||
src << "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad."
|
||||
src << "For department channels, use the following say commands:"
|
||||
|
||||
var/radio_text = ""
|
||||
for(var/i = 1 to common_radio.channels.len)
|
||||
var/channel = common_radio.channels[i]
|
||||
var/key = get_radio_key_from_channel(channel)
|
||||
radio_text += "[key] - [channel]"
|
||||
if(i != common_radio.channels.len)
|
||||
radio_text += ", "
|
||||
|
||||
src << radio_text
|
||||
|
||||
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
|
||||
show_laws()
|
||||
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
job = "AI"
|
||||
|
||||
/mob/living/silicon/ai/proc/SetName(pickedName as text)
|
||||
real_name = pickedName
|
||||
name = pickedName
|
||||
@@ -225,7 +259,7 @@ var/list/ai_list = list()
|
||||
if(powered_ai.anchored)
|
||||
use_power = 2
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
/mob/living/silicon/ai/proc/pick_icon()
|
||||
set category = "AI Commands"
|
||||
set name = "Set AI Core Display"
|
||||
if(stat || aiRestorePowerRoutine)
|
||||
@@ -289,6 +323,9 @@ var/list/ai_list = list()
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_alerts()
|
||||
set name = "Show Alerts"
|
||||
set category = "AI Commands"
|
||||
|
||||
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
|
||||
dat += "<A HREF='?src=\ref[src];mach_close=aialerts'>Close</A><BR><BR>"
|
||||
for (var/cat in alarms)
|
||||
@@ -323,9 +360,14 @@ var/list/ai_list = list()
|
||||
|
||||
// this verb lets the ai see the stations manifest
|
||||
/mob/living/silicon/ai/proc/ai_roster()
|
||||
set name = "Show Crew Manifest"
|
||||
set category = "AI Commands"
|
||||
show_station_manifest()
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_call_shuttle()
|
||||
set name = "Call Emergency Shuttle"
|
||||
set category = "AI Commands"
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't call the shuttle because you are dead!"
|
||||
return
|
||||
@@ -905,7 +947,7 @@ var/list/ai_list = list()
|
||||
else
|
||||
lightNearbyCamera()
|
||||
|
||||
/mob/living/silicon/ai/proc/control_hud()
|
||||
/mob/living/silicon/ai/proc/sensor_mode()
|
||||
set name = "Set Sensor Augmentation"
|
||||
set desc = "Augment visual feed with internal sensor overlays."
|
||||
set category = "AI Commands"
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
number++
|
||||
|
||||
|
||||
/mob/living/silicon/ai/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite
|
||||
/mob/living/silicon/ai/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite
|
||||
set category = "AI Commands"
|
||||
set name = "State Laws"
|
||||
|
||||
|
||||
@@ -704,6 +704,7 @@
|
||||
remove_language("Trinary")
|
||||
remove_language("Chittin")
|
||||
remove_language("Bubblish")
|
||||
remove_language("Clownish")
|
||||
|
||||
src << "\blue Translator Module toggled OFF."
|
||||
|
||||
@@ -718,5 +719,6 @@
|
||||
add_language("Trinary")
|
||||
add_language("Chittin")
|
||||
add_language("Bubblish")
|
||||
add_language("Clownish")
|
||||
|
||||
src << "\blue Translator Module toggled ON."
|
||||
@@ -8,6 +8,21 @@
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("ping","buzz","beep","law") //halt is exempt because it's used to stop criminal scum
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
//Everything else, including typos of the above emotes
|
||||
else
|
||||
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
|
||||
|
||||
if(on_CD == 1) // Check if we need to suppress the emote attempt.
|
||||
return // Suppress emote, you're still cooling off.
|
||||
//--FalseIncarnate
|
||||
|
||||
switch(act)
|
||||
if ("me")
|
||||
if (src.client)
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
number++
|
||||
|
||||
|
||||
/mob/living/silicon/robot/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite
|
||||
/mob/living/silicon/robot/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite
|
||||
set category = "Robot Commands"
|
||||
set name = "State Laws"
|
||||
var/list = "<b>Which laws do you want to include when stating them for the crew?</b><br><br>"
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
var/list/robot_verbs_default = list(
|
||||
/mob/living/silicon/robot/proc/sensor_mode,
|
||||
/mob/living/silicon/robot/proc/checklaws
|
||||
)
|
||||
|
||||
/mob/living/silicon/robot
|
||||
name = "Cyborg"
|
||||
real_name = "Cyborg"
|
||||
@@ -71,8 +76,7 @@
|
||||
var/braintype = "Cyborg"
|
||||
var/base_icon = ""
|
||||
var/crisis = 0
|
||||
var/hiddenborg = 0
|
||||
|
||||
|
||||
var/obj/item/borg/sight/hud/sec/sechud = null
|
||||
var/obj/item/borg/sight/hud/med/healthhud = null
|
||||
|
||||
@@ -82,34 +86,21 @@
|
||||
spark_system.attach(src)
|
||||
|
||||
add_language("Robot Talk", 1)
|
||||
|
||||
wires = new(src)
|
||||
|
||||
robot_modules_background = new()
|
||||
robot_modules_background.icon_state = "block"
|
||||
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
|
||||
|
||||
wires = new(src)
|
||||
|
||||
ident = rand(1, 999)
|
||||
updatename("Default")
|
||||
updateicon()
|
||||
if(mmi == null)
|
||||
mmi = new /obj/item/device/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works)
|
||||
mmi.icon_state="posibrain-occupied"
|
||||
if(syndie)
|
||||
if(!cell)
|
||||
cell = new /obj/item/weapon/stock_parts/cell(src)
|
||||
laws = new /datum/ai_laws/antimov()
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
module = new /obj/item/weapon/robot_module/syndicate(src)
|
||||
hands.icon_state = "standard"
|
||||
icon_state = "secborg"
|
||||
modtype = "Security"
|
||||
init(alien)
|
||||
|
||||
radio = new /obj/item/device/radio/borg(src)
|
||||
common_radio = radio
|
||||
|
||||
init()
|
||||
|
||||
if(!scrambledcodes && !camera)
|
||||
camera = new /obj/machinery/camera(src)
|
||||
camera.c_tag = real_name
|
||||
@@ -117,6 +108,10 @@
|
||||
if(wires.IsCameraCut()) // 5 = BORG CAMERA
|
||||
camera.status = 0
|
||||
|
||||
if(mmi == null)
|
||||
mmi = new /obj/item/device/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works)
|
||||
mmi.icon_state="posibrain-occupied"
|
||||
|
||||
initialize_components()
|
||||
//if(!unfinished)
|
||||
// Create all the robot parts.
|
||||
@@ -131,6 +126,8 @@
|
||||
cell.charge = 7500
|
||||
|
||||
..()
|
||||
|
||||
add_robot_verbs()
|
||||
|
||||
if(cell)
|
||||
var/datum/robot_component/cell_component = components["power cell"]
|
||||
@@ -148,17 +145,9 @@
|
||||
hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
|
||||
/mob/living/silicon/robot/proc/init(var/alien=0)
|
||||
if(hiddenborg)
|
||||
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
|
||||
return
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
if(mmi.alien || alien)
|
||||
laws = new /datum/ai_laws/alienmov()
|
||||
connected_ai = select_active_alien_ai()
|
||||
scrambledcodes = 1
|
||||
else
|
||||
make_laws()
|
||||
connected_ai = select_active_ai_with_fewest_borgs()
|
||||
make_laws()
|
||||
connected_ai = select_active_ai_with_fewest_borgs()
|
||||
if(connected_ai)
|
||||
connected_ai.connected_robots += src
|
||||
lawsync()
|
||||
@@ -174,7 +163,7 @@
|
||||
if (!rbPDA)
|
||||
rbPDA = new/obj/item/device/pda/ai(src)
|
||||
rbPDA.set_name_and_job(custom_name,braintype)
|
||||
if(hiddenborg)
|
||||
if(scrambledcodes)
|
||||
rbPDA.hidden = 1
|
||||
|
||||
/mob/living/silicon/robot/binarycheck()
|
||||
@@ -451,11 +440,17 @@
|
||||
C.toggled = 1
|
||||
src << "\red You enable [C.name]."
|
||||
|
||||
/mob/living/silicon/robot/verb/control_hud()
|
||||
/mob/living/silicon/robot/proc/sensor_mode()
|
||||
set name = "Set Sensor Augmentation"
|
||||
set desc = "Augment visual feed with internal sensor overlays."
|
||||
set category = "Robot Commands"
|
||||
toggle_sensor_mode()
|
||||
|
||||
/mob/living/silicon/robot/proc/add_robot_verbs()
|
||||
src.verbs |= robot_verbs_default
|
||||
|
||||
/mob/living/silicon/robot/proc/remove_robot_verbs()
|
||||
src.verbs -= robot_verbs_default
|
||||
|
||||
/mob/living/silicon/robot/blob_act()
|
||||
if (stat != 2)
|
||||
@@ -1395,21 +1390,29 @@
|
||||
icon_state = "nano_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
hiddenborg = 1
|
||||
modtype = "Commando"
|
||||
faction = list("nanotrasen")
|
||||
designation = "NT Combat Cyborg"
|
||||
req_access = list(access_cent_specops)
|
||||
|
||||
|
||||
/mob/living/silicon/robot/deathsquad/New(loc)
|
||||
..()
|
||||
cell.maxcharge = 50000
|
||||
cell.charge = 50000
|
||||
radio = new /obj/item/device/radio/borg/deathsquad(src)
|
||||
module = new /obj/item/weapon/robot_module/deathsquad(src)
|
||||
laws = new /datum/ai_laws/deathsquad()
|
||||
if(!cell)
|
||||
cell = new /obj/item/weapon/stock_parts/cell(src)
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
|
||||
Namepick()
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/deathsquad/init()
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
|
||||
laws = new /datum/ai_laws/deathsquad
|
||||
module = new /obj/item/weapon/robot_module/deathsquad(src)
|
||||
|
||||
radio = new /obj/item/device/radio/borg/deathsquad(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/deathsquad/attack_hand(mob/user)
|
||||
if((ckey == null) && searching_for_ckey == 0)
|
||||
@@ -1453,12 +1456,10 @@
|
||||
get_borg_occupant(user, possiblecandidates)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/silicon/robot/syndicate
|
||||
icon_state = "syndie_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
hiddenborg = 1
|
||||
modtype = "Synd"
|
||||
faction = list("syndicate")
|
||||
designation = "Syndicate"
|
||||
@@ -1466,14 +1467,23 @@
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/New(loc)
|
||||
..()
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
radio = new /obj/item/device/radio/borg/syndicate(src)
|
||||
module = new /obj/item/weapon/robot_module/syndicate(src)
|
||||
laws = new /datum/ai_laws/syndicate_override()
|
||||
if(!cell)
|
||||
cell = new /obj/item/weapon/stock_parts/cell(src)
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
|
||||
Namepick()
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/init()
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
|
||||
laws = new /datum/ai_laws/syndicate_override
|
||||
module = new /obj/item/weapon/robot_module/syndicate(src)
|
||||
|
||||
radio = new /obj/item/device/radio/borg/syndicate(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/canUseTopic(atom/movable/M)
|
||||
if(stat || lockcharge || stunned || weakened)
|
||||
|
||||
@@ -1,92 +1,4 @@
|
||||
// A special tray for the service droid. Allow droid to pick up and drop items as if they were using the tray normally
|
||||
// Click on table to unload, click on item to load. Otherwise works identically to a tray.
|
||||
// Unlike the base item "tray", robotrays ONLY pick up food, drinks and condiments.
|
||||
|
||||
/obj/item/weapon/tray/robotray
|
||||
name = "RoboTray"
|
||||
desc = "An autoloading tray specialized for carrying refreshments."
|
||||
|
||||
/obj/item/weapon/tray/robotray/afterattack(atom/target, mob/user as mob)
|
||||
if ( !target )
|
||||
return
|
||||
// pick up items, mostly copied from base tray pickup proc
|
||||
// see code\game\objects\items\weapons\kitchen.dm line 241
|
||||
if ( istype(target,/obj/item))
|
||||
if ( !isturf(target.loc) ) // Don't load up stuff if it's inside a container or mob!
|
||||
return
|
||||
var turf/pickup = target.loc
|
||||
|
||||
var addedSomething = 0
|
||||
|
||||
for(var/obj/item/weapon/reagent_containers/food/I in pickup)
|
||||
|
||||
|
||||
if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
|
||||
var/add = 0
|
||||
if(I.w_class == 1.0)
|
||||
add = 1
|
||||
else if(I.w_class == 2.0)
|
||||
add = 3
|
||||
else
|
||||
add = 5
|
||||
if(calc_carry() + add >= max_carry)
|
||||
break
|
||||
|
||||
I.loc = src
|
||||
carrying.Add(I)
|
||||
overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
|
||||
addedSomething = 1
|
||||
if ( addedSomething )
|
||||
user.visible_message("\blue [user] load some items onto their service tray.")
|
||||
|
||||
return
|
||||
|
||||
// Unloads the tray, copied from base item's proc dropped() and altered
|
||||
// see code\game\objects\items\weapons\kitchen.dm line 263
|
||||
|
||||
if ( isturf(target) || istype(target,/obj/structure/table) )
|
||||
var foundtable = istype(target,/obj/structure/table/)
|
||||
if ( !foundtable ) //it must be a turf!
|
||||
for(var/obj/structure/table/T in target)
|
||||
foundtable = 1
|
||||
break
|
||||
|
||||
var turf/dropspot
|
||||
if ( !foundtable ) // don't unload things onto walls or other silly places.
|
||||
dropspot = user.loc
|
||||
else if ( isturf(target) ) // they clicked on a turf with a table in it
|
||||
dropspot = target
|
||||
else // they clicked on a table
|
||||
dropspot = target.loc
|
||||
|
||||
|
||||
overlays = null
|
||||
|
||||
var droppedSomething = 0
|
||||
|
||||
for(var/obj/item/I in carrying)
|
||||
I.loc = dropspot
|
||||
carrying.Remove(I)
|
||||
droppedSomething = 1
|
||||
if(!foundtable && isturf(dropspot))
|
||||
// if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
|
||||
spawn()
|
||||
for(var/i = 1, i <= rand(1,2), i++)
|
||||
if(I)
|
||||
step(I, pick(NORTH,SOUTH,EAST,WEST))
|
||||
sleep(rand(2,4))
|
||||
if ( droppedSomething )
|
||||
if ( foundtable )
|
||||
user.visible_message("\blue [user] unloads their service tray.")
|
||||
else
|
||||
user.visible_message("\blue [user] drops all the items on their tray.")
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
|
||||
// A special pen for service droids. Can be toggled to switch between normal writting mode, and paper rename mode
|
||||
// A special pen for service droids. Can be toggled to switch between normal writing mode, and paper rename mode
|
||||
// Allows service droids to rename paper items.
|
||||
|
||||
/obj/item/weapon/pen/robopen
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
R.add_language("Galactic Common", 1)
|
||||
R.add_language("Sol Common", 1)
|
||||
R.add_language("Tradeband", 1)
|
||||
R.add_language("Gutter", 0)
|
||||
R.add_language("Sinta'unathi", 0)
|
||||
R.add_language("Siik'tajr", 0)
|
||||
R.add_language("Skrellian", 0)
|
||||
@@ -70,7 +71,7 @@
|
||||
R.add_language("Trinary", 1)
|
||||
R.add_language("Chittin", 0)
|
||||
R.add_language("Bubblish", 0)
|
||||
R.add_language("Gutter", 0)
|
||||
R.add_language("Clownish",0)
|
||||
|
||||
/obj/item/weapon/robot_module/standard
|
||||
name = "standard robot module"
|
||||
@@ -216,7 +217,7 @@
|
||||
src.modules += new /obj/item/device/flashlight(src)
|
||||
src.modules += new /obj/item/device/flash/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/trash(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/mop(src)
|
||||
src.modules += new /obj/item/device/lightreplacer(src)
|
||||
src.modules += new /obj/item/weapon/holosign_creator(src)
|
||||
@@ -247,7 +248,7 @@
|
||||
|
||||
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
|
||||
src.modules += new /obj/item/weapon/lighter/zippo(src)
|
||||
src.modules += new /obj/item/weapon/tray/robotray(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
||||
|
||||
@@ -270,6 +271,7 @@
|
||||
R.add_language("Galactic Common", 1)
|
||||
R.add_language("Sol Common", 1)
|
||||
R.add_language("Tradeband", 1)
|
||||
R.add_language("Gutter", 1)
|
||||
R.add_language("Sinta'unathi", 1)
|
||||
R.add_language("Siik'tajr", 1)
|
||||
R.add_language("Skrellian", 1)
|
||||
@@ -278,7 +280,7 @@
|
||||
R.add_language("Trinary", 1)
|
||||
R.add_language("Chittin", 1)
|
||||
R.add_language("Bubblish", 1)
|
||||
R.add_language("Gutter", 1)
|
||||
R.add_language("Clownish",1)
|
||||
|
||||
/*
|
||||
/obj/item/weapon/robot_module/clerical //Whyyyyy?
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#define SEC_HUD 1 //Security HUD mode
|
||||
#define MED_HUD 2 //Medical HUD mode
|
||||
var/local_transmit //If set, can only speak to others of the same type within a short range.
|
||||
var/obj/item/device/radio/common_radio
|
||||
|
||||
/mob/living/silicon/proc/cancelAlarm()
|
||||
return
|
||||
|
||||
+25
-19
@@ -855,7 +855,7 @@ var/list/slot_equipment_priority = list( \
|
||||
return 0
|
||||
src << message
|
||||
return 1
|
||||
|
||||
|
||||
/mob/proc/is_muzzled()
|
||||
return 0
|
||||
|
||||
@@ -873,25 +873,14 @@ var/list/slot_equipment_priority = list( \
|
||||
stat(null, "CPU:\t[world.cpu]")
|
||||
stat(null, "Instances:\t[world.contents.len]")
|
||||
|
||||
if(master_controller)
|
||||
/* HANDLED THROUGH PROCESS SCHEDULER
|
||||
stat(null, "MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])")
|
||||
stat(null, "Air-[master_controller.air_cost]")
|
||||
stat(null, "Sun-[master_controller.sun_cost]")
|
||||
stat(null, "Mob-[master_controller.mobs_cost]\t#[mob_list.len]")
|
||||
stat(null, "Dis-[master_controller.diseases_cost]\t#[active_diseases.len]")
|
||||
stat(null, "Mch-[master_controller.machines_cost]\t#[machines.len]")
|
||||
stat(null, "Bots-[master_controller.aibots_cost]\t#[aibots.len]")
|
||||
stat(null, "Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
|
||||
stat(null, "PiNet-[master_controller.networks_cost]\t#[pipe_networks.len]")
|
||||
stat(null, "PoNet-[master_controller.powernets_cost]\t#[powernets.len]")
|
||||
stat(null, "NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
|
||||
// stat(null, "GC-[master_controller.gc_cost]\t#[garbage.queue.len]")
|
||||
stat(null, "Tick-[master_controller.ticker_cost]")*/
|
||||
stat(null,"Events-[master_controller.events_cost]\t#[event_manager.active_events.len]")
|
||||
stat(null, "ALL-[master_controller.total_cost]")
|
||||
if (garbageCollector)
|
||||
stat(null, "\tqdel - [garbageCollector.del_everything ? "off" : "on"]")
|
||||
stat(null, "\ton queue - [garbageCollector.queue.len]")
|
||||
stat(null, "\ttotal delete - [garbageCollector.dels_count]")
|
||||
stat(null, "\tsoft delete - [garbageCollector.soft_dels]")
|
||||
stat(null, "\thard delete - [garbageCollector.hard_dels]")
|
||||
else
|
||||
stat(null, "MasterController-ERROR")
|
||||
stat(null, "Garbage Controller is not running.")
|
||||
|
||||
if(processScheduler.getIsRunning())
|
||||
var/datum/controller/process/process
|
||||
@@ -929,6 +918,9 @@ var/list/slot_equipment_priority = list( \
|
||||
process = processScheduler.getProcess("disease")
|
||||
stat(null, "DIS([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
|
||||
|
||||
process = processScheduler.getProcess("garbage")
|
||||
stat(null, "GAR\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
|
||||
|
||||
//process = processScheduler.getProcess("sun")
|
||||
//stat(null, "SUN\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
|
||||
|
||||
@@ -960,6 +952,8 @@ var/list/slot_equipment_priority = list( \
|
||||
for(var/atom/A in listed_turf)
|
||||
if(A.invisibility > see_invisible)
|
||||
continue
|
||||
if(is_type_in_list(A, shouldnt_see))
|
||||
continue
|
||||
statpanel(listed_turf.name, null, A)
|
||||
|
||||
if(mind && mind.changeling)
|
||||
@@ -1122,16 +1116,19 @@ var/list/slot_equipment_priority = list( \
|
||||
/mob/proc/Stun(amount)
|
||||
if(status_flags & CANSTUN)
|
||||
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
|
||||
if(status_flags & CANSTUN)
|
||||
stunned = max(amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/AdjustStunned(amount)
|
||||
if(status_flags & CANSTUN)
|
||||
stunned = max(stunned + amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/Weaken(amount)
|
||||
@@ -1155,40 +1152,49 @@ var/list/slot_equipment_priority = list( \
|
||||
/mob/proc/Paralyse(amount)
|
||||
if(status_flags & CANPARALYSE)
|
||||
paralysis = max(max(paralysis,amount),0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/SetParalysis(amount)
|
||||
if(status_flags & CANPARALYSE)
|
||||
paralysis = max(amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/AdjustParalysis(amount)
|
||||
if(status_flags & CANPARALYSE)
|
||||
paralysis = max(paralysis + amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/Sleeping(amount)
|
||||
sleeping = max(max(sleeping,amount),0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/SetSleeping(amount)
|
||||
sleeping = max(amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/AdjustSleeping(amount)
|
||||
sleeping = max(sleeping + amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/Resting(amount)
|
||||
resting = max(max(resting,amount),0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/SetResting(amount)
|
||||
resting = max(amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/AdjustResting(amount)
|
||||
resting = max(resting + amount,0)
|
||||
update_canmove()
|
||||
return
|
||||
|
||||
/mob/proc/get_species()
|
||||
|
||||
@@ -138,6 +138,8 @@
|
||||
|
||||
var/coughedtime = null
|
||||
|
||||
var/emote_cd = 0 // Used to supress emote spamming. 1 if on CD, 2 if disabled by admin (manually set), else 0
|
||||
|
||||
var/inertia_dir = 0
|
||||
|
||||
var/music_lastplayed = "null"
|
||||
@@ -220,6 +222,7 @@
|
||||
var/immune_to_ssd = 0
|
||||
|
||||
var/turf/listed_turf = null //the current turf being examined in the stat panel
|
||||
var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
|
||||
|
||||
var/kills=0
|
||||
|
||||
|
||||
@@ -24,9 +24,7 @@
|
||||
|
||||
|
||||
proc/new_player_panel_proc()
|
||||
var/output = "<div align='center'><B>New Player Options</B>"
|
||||
output +="<hr>"
|
||||
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A></p>"
|
||||
var/output = "<center><p><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A></p>"
|
||||
|
||||
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
|
||||
if(!ready) output += "<p><a href='byond://?src=\ref[src];ready=1'>Declare Ready</A></p>"
|
||||
@@ -57,9 +55,9 @@
|
||||
else
|
||||
output += "<p><a href='byond://?src=\ref[src];showpoll=1'>Show Player Polls</A></p>"
|
||||
|
||||
output += "</div>"
|
||||
output += "</center>"
|
||||
|
||||
var/datum/browser/popup = new(src, "playersetup", "<div align='center'>New Player Options</div>", 210, 240)
|
||||
var/datum/browser/popup = new(src, "playersetup", "<div align='center'>New Player Options</div>", 220, 290)
|
||||
popup.set_window_options("can_close=0")
|
||||
popup.set_content(output)
|
||||
popup.open(0)
|
||||
@@ -105,6 +103,7 @@
|
||||
|
||||
if(href_list["ready"])
|
||||
ready = !ready
|
||||
new_player_panel_proc()
|
||||
|
||||
if(href_list["refresh"])
|
||||
src << browse(null, "window=playersetup") //closes the player setup window
|
||||
@@ -115,7 +114,7 @@
|
||||
if(alert(src,"Are you sure you wish to observe? You will have to wait 30 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
|
||||
if(!client) return 1
|
||||
var/mob/dead/observer/observer = new()
|
||||
|
||||
src << browse(null, "window=playersetup")
|
||||
spawning = 1
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
|
||||
|
||||
@@ -309,7 +308,7 @@
|
||||
EquipRacialItems(character)
|
||||
character = job_master.EquipRank(character, rank, 1) //equips the human
|
||||
EquipCustomItems(character)
|
||||
|
||||
|
||||
// AIs don't need a spawnpoint, they must spawn at an empty core
|
||||
if(character.mind.assigned_role == "AI")
|
||||
|
||||
@@ -346,7 +345,7 @@
|
||||
else
|
||||
character.loc = pick(latejoin)
|
||||
join_message = "has arrived on the station"
|
||||
|
||||
|
||||
character.lastarea = get_area(loc)
|
||||
// Moving wheelchair if they have one
|
||||
if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair))
|
||||
@@ -398,12 +397,12 @@
|
||||
if(character.mind)
|
||||
if((character.mind.special_role != "MODE"))
|
||||
var/arrivalmessage = "A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"]."
|
||||
announcer.say(";[arrivalmessage]")
|
||||
announcer.say(";[arrivalmessage]")
|
||||
else
|
||||
if(character.mind)
|
||||
if((character.mind.special_role != "MODE"))
|
||||
// can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc.
|
||||
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
|
||||
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
|
||||
|
||||
proc/LateChoices()
|
||||
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
|
||||
@@ -444,9 +443,9 @@
|
||||
proc/create_character()
|
||||
spawning = 1
|
||||
close_spawn_windows()
|
||||
|
||||
|
||||
var/mob/living/carbon/human/new_character
|
||||
|
||||
|
||||
var/datum/species/chosen_species
|
||||
if(client.prefs.species)
|
||||
chosen_species = all_species[client.prefs.species]
|
||||
@@ -454,10 +453,10 @@
|
||||
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
||||
if(is_species_whitelisted(chosen_species) || has_admin_rights())
|
||||
new_character = new(loc, client.prefs.species)
|
||||
|
||||
|
||||
if(!new_character)
|
||||
new_character = new(loc)
|
||||
|
||||
|
||||
new_character.lastarea = get_area(loc)
|
||||
|
||||
var/datum/language/chosen_language
|
||||
@@ -505,9 +504,9 @@
|
||||
if(client.prefs.disabilities & DISABILITY_FLAG_DEAF)
|
||||
new_character.dna.SetSEState(DEAFBLOCK,1,1)
|
||||
new_character.sdisabilities |= DEAF
|
||||
|
||||
|
||||
chosen_species.handle_dna(new_character)
|
||||
|
||||
|
||||
domutcheck(new_character)
|
||||
new_character.dna.UpdateSE()
|
||||
|
||||
|
||||
@@ -602,7 +602,7 @@
|
||||
|
||||
taj_sideburns
|
||||
name = "Tajara Sideburns"
|
||||
icon_state = "facial_mutton"
|
||||
icon_state = "facial_sideburns"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_mutton
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
invisibility = 101
|
||||
return ..()
|
||||
|
||||
/mob/proc/AIize(move=1)
|
||||
/mob/proc/AIize()
|
||||
if(client)
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs
|
||||
var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect.
|
||||
@@ -93,52 +93,40 @@
|
||||
else
|
||||
O.key = key
|
||||
|
||||
if(move)
|
||||
var/obj/loc_landmark
|
||||
var/obj/loc_landmark
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
if (sloc.name != "AI")
|
||||
continue
|
||||
if (locate(/mob/living) in sloc.loc)
|
||||
continue
|
||||
loc_landmark = sloc
|
||||
if (!loc_landmark)
|
||||
for(var/obj/effect/landmark/tripai in landmarks_list)
|
||||
if (tripai.name == "tripai")
|
||||
if(locate(/mob/living) in tripai.loc)
|
||||
continue
|
||||
loc_landmark = tripai
|
||||
if (!loc_landmark)
|
||||
O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone."
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
if (sloc.name != "AI")
|
||||
continue
|
||||
if ((locate(/mob/living) in sloc.loc) || (locate(/obj/structure/AIcore) in sloc.loc))
|
||||
continue
|
||||
loc_landmark = sloc
|
||||
if (!loc_landmark)
|
||||
for(var/obj/effect/landmark/tripai in landmarks_list)
|
||||
if (tripai.name == "tripai")
|
||||
if((locate(/mob/living) in tripai.loc) || (locate(/obj/structure/AIcore) in tripai.loc))
|
||||
continue
|
||||
loc_landmark = tripai
|
||||
if (!loc_landmark)
|
||||
O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone."
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
if (sloc.name == "AI")
|
||||
loc_landmark = sloc
|
||||
if (sloc.name == "AI")
|
||||
loc_landmark = sloc
|
||||
|
||||
O.loc = loc_landmark.loc
|
||||
for (var/obj/item/device/radio/intercom/comm in O.loc)
|
||||
comm.ai += O
|
||||
O.loc = loc_landmark.loc
|
||||
for (var/obj/item/device/radio/intercom/comm in O.loc)
|
||||
comm.ai += O
|
||||
|
||||
O << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
O << "<B>To look at other parts of the station, click on yourself to get a camera menu.</B>"
|
||||
O << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
O << "To use something, simply click on it."
|
||||
O << {"Use say ":b to speak to your cyborgs through binary."}
|
||||
if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai)))
|
||||
O.show_laws()
|
||||
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
O.on_mob_init()
|
||||
|
||||
O.verbs += /mob/living/silicon/ai/proc/show_laws_verb
|
||||
O.verbs += /mob/living/silicon/ai/proc/ai_statuschange
|
||||
|
||||
O.job = "AI"
|
||||
O.add_ai_verbs()
|
||||
|
||||
O.rename_self("ai",1)
|
||||
spawn(0)
|
||||
del(src)
|
||||
return O
|
||||
|
||||
. = O
|
||||
qdel(src)
|
||||
|
||||
/mob/living/carbon/human/make_into_mask(var/should_gib = 0)
|
||||
for(var/t in organs)
|
||||
del(t)
|
||||
qdel(t)
|
||||
return ..(should_gib)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
||||
|
||||
// Added spess ghoasts/cameras to this so they don't add to the lag. - N3X
|
||||
var/global/narsie_cometh = 0
|
||||
var/global/list/uneatable = list(
|
||||
/turf/space,
|
||||
/obj/effect/overlay,
|
||||
@@ -508,6 +509,7 @@ var/global/list/uneatable = list(
|
||||
if(emergency_shuttle && emergency_shuttle.can_call())
|
||||
emergency_shuttle.call_evac()
|
||||
emergency_shuttle.launch_time = 0 // Cannot recall
|
||||
narsie_cometh = 1
|
||||
|
||||
|
||||
/obj/machinery/singularity/narsie/proc/spawn_animation()
|
||||
@@ -541,7 +543,7 @@ var/global/list/uneatable = list(
|
||||
if(istype(A,/obj/))
|
||||
var/obj/O = A
|
||||
O.ex_act(1.0)
|
||||
if(O) del(O)
|
||||
if(O) qdel(O)
|
||||
|
||||
else if(isturf(A))
|
||||
var/turf/T = A
|
||||
@@ -565,7 +567,7 @@ var/global/list/uneatable = list(
|
||||
var/obj/O = A
|
||||
machines -= O
|
||||
processing_objects -= O
|
||||
O.loc = null
|
||||
qdel(O)
|
||||
else if(isturf(A))
|
||||
var/turf/T = A
|
||||
if(istype(T,/turf/simulated/wall))
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
charge_cost = 2000
|
||||
modifystate = "advtaserstun"
|
||||
can_flashlight = 1
|
||||
fire_delay = 20
|
||||
|
||||
var/mode = 0 //0 = stun, 1 = disable
|
||||
|
||||
@@ -24,6 +25,7 @@
|
||||
user << "\red [src.name] is now set to Disable."
|
||||
projectile_type = "/obj/item/projectile/beam/disabler"
|
||||
modifystate = "advtaserdisable"
|
||||
fire_delay = 0
|
||||
if(1)
|
||||
mode = 0
|
||||
charge_cost = 2000
|
||||
@@ -31,6 +33,7 @@
|
||||
user << "\red [src.name] is now set to stun."
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
modifystate = "advtaserstun"
|
||||
fire_delay = 20
|
||||
update_icon()
|
||||
if(user.l_hand == src)
|
||||
user.update_inv_l_hand()
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/weapon/gun/energy/hos
|
||||
name = "HoS Energy Gun"
|
||||
desc = "This is a modern recreation of the antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time, its also expensive."
|
||||
icon_state = "hoslaser"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
icon_override = 'icons/mob/in-hand/guns.dmi'
|
||||
force = 10
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
origin_tech = "combat=3;magnets=2"
|
||||
charge_cost = 2000
|
||||
modifystate = "hoslaserstun"
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
var/mode = 2
|
||||
|
||||
attack_self(mob/living/user as mob)
|
||||
switch(mode)
|
||||
if(2)
|
||||
mode = 0
|
||||
charge_cost = 1000
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
user << "\red [src.name] is now set to kill."
|
||||
projectile_type = "/obj/item/projectile/beam"
|
||||
modifystate = "hoslaserkill"
|
||||
fire_delay = 0
|
||||
if(0)
|
||||
mode = 1
|
||||
charge_cost = 500
|
||||
fire_sound = 'sound/weapons/taser2.ogg'
|
||||
user << "\red [src.name] is now set to disable."
|
||||
projectile_type = "/obj/item/projectile/beam/disabler"
|
||||
modifystate = "hoslaserdisable"
|
||||
fire_delay = 0
|
||||
if(1)
|
||||
mode = 2
|
||||
charge_cost = 2000
|
||||
fire_sound = 'sound/weapons/taser.ogg'
|
||||
user << "\red [src.name] is now set to stun."
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
modifystate = "hoslaserstun"
|
||||
fire_delay = 20
|
||||
update_icon()
|
||||
if(user.l_hand == src)
|
||||
user.update_inv_l_hand()
|
||||
else
|
||||
user.update_inv_r_hand()
|
||||
@@ -24,6 +24,8 @@ obj/item/weapon/gun/energy/laser/retro
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/captain
|
||||
icon_state = "caplaser"
|
||||
item_state = "caplaser"
|
||||
icon_override = 'icons/mob/in-hand/guns.dmi'
|
||||
desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding."
|
||||
force = 10
|
||||
origin_tech = null
|
||||
|
||||
@@ -43,9 +43,6 @@
|
||||
desc = "An energy gun with an experimental miniaturized reactor."
|
||||
icon_state = "nucgun"
|
||||
origin_tech = "combat=3;materials=5;powerstorage=3"
|
||||
charge_cost = 1000
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
var/lightfail = 0
|
||||
var/charge_tick = 0
|
||||
can_flashlight = 0
|
||||
@@ -120,9 +117,6 @@
|
||||
update_mode()
|
||||
if (mode == 0)
|
||||
overlays += "nucgun-stun"
|
||||
charge_cost = 1000
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
else if (mode == 1)
|
||||
overlays += "nucgun-kill"
|
||||
|
||||
|
||||
@@ -20,18 +20,21 @@
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
user << "\red [src.name] is now set to stun."
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
fire_delay = 20
|
||||
if(0)
|
||||
mode = 1
|
||||
charge_cost = 100
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
user << "\red [src.name] is now set to kill."
|
||||
projectile_type = "/obj/item/projectile/beam"
|
||||
fire_delay = 0
|
||||
if(1)
|
||||
mode = 2
|
||||
charge_cost = 200
|
||||
fire_sound = 'sound/weapons/pulse.ogg'
|
||||
user << "\red [src.name] is now set to DESTROY."
|
||||
projectile_type = "/obj/item/projectile/beam/pulse"
|
||||
fire_delay = 0
|
||||
return
|
||||
|
||||
isHandgun()
|
||||
|
||||
@@ -180,7 +180,7 @@ obj/item/weapon/gun/energy/staff/focus
|
||||
projectile_type = "/obj/item/projectile/beam/sniper"
|
||||
slot_flags = SLOT_BACK
|
||||
charge_cost = 2500
|
||||
fire_delay = 10
|
||||
fire_delay = 50
|
||||
w_class = 4.0
|
||||
var/zoom = 0
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
|
||||
fire_delay = 20
|
||||
|
||||
/obj/item/weapon/gun/energy/taser/cyborg
|
||||
name = "taser gun"
|
||||
@@ -50,9 +51,9 @@
|
||||
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as much ammo as a standard taser."
|
||||
icon_state = "stunrevolver"
|
||||
fire_sound = "sound/weapons/gunshot.ogg"
|
||||
origin_tech = "combat=3;materials=3;powerstorage=2"
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell"
|
||||
fire_delay = 20
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,12 @@
|
||||
sparks.set_up(1, 1, src)
|
||||
sparks.start()
|
||||
proj_hit = 1
|
||||
else if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(HULK in C.mutations)
|
||||
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||
else if(C.status_flags & CANWEAKEN)
|
||||
C.do_jitter_animation(jitter)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
|
||||
|
||||
@@ -640,3 +640,10 @@ datum
|
||||
atom/proc/create_reagents(var/max_vol)
|
||||
reagents = new/datum/reagents(max_vol)
|
||||
reagents.my_atom = src
|
||||
|
||||
/datum/reagents/Destroy()
|
||||
for(var/datum/reagent/reagent in reagent_list)
|
||||
reagent.Destroy()
|
||||
|
||||
if(my_atom)
|
||||
my_atom = null
|
||||
@@ -210,6 +210,7 @@ datum
|
||||
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
|
||||
reagent_state = LIQUID
|
||||
color = "#0064C8" // rgb: 0, 100, 200
|
||||
var/cooling_temperature = 2
|
||||
|
||||
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
if(!istype(M, /mob/living))
|
||||
@@ -224,6 +225,7 @@ datum
|
||||
|
||||
reaction_turf(var/turf/simulated/T, var/volume)
|
||||
if (!istype(T)) return
|
||||
var/CT = cooling_temperature
|
||||
src = null
|
||||
if(volume >= 3)
|
||||
if(T.wet >= 1) return
|
||||
@@ -248,10 +250,10 @@ datum
|
||||
var/hotspot = (locate(/obj/fire) in T)
|
||||
if(hotspot && !istype(T, /turf/space))
|
||||
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
|
||||
lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
|
||||
lowertemp.temperature = max( min(lowertemp.temperature-(CT*1000),lowertemp.temperature / CT) ,0)
|
||||
lowertemp.react()
|
||||
T.assume_air(lowertemp)
|
||||
del(hotspot)
|
||||
qdel(hotspot)
|
||||
return
|
||||
|
||||
reaction_obj(var/obj/O, var/volume)
|
||||
@@ -1433,6 +1435,13 @@ datum
|
||||
H.adjustToxLoss(50)
|
||||
..()
|
||||
return
|
||||
if(ismonkey(M))
|
||||
var/mob/living/carbon/monkey/MO = M
|
||||
if(MO.dna)
|
||||
if(MO.dna.mutantrace == "plant") //plantmen monkeys (diona) take EVEN MORE damage
|
||||
MO.adjustToxLoss(100)
|
||||
..()
|
||||
return
|
||||
|
||||
plasma
|
||||
name = "Plasma"
|
||||
@@ -1713,7 +1722,7 @@ datum
|
||||
|
||||
nanites
|
||||
name = "Nanites"
|
||||
id = "nanities"
|
||||
id = "nanites"
|
||||
description = "Nanomachines that aid in rapid cellular regeneration."
|
||||
|
||||
|
||||
@@ -3989,4 +3998,10 @@ datum
|
||||
|
||||
*/
|
||||
// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
|
||||
#undef REM
|
||||
#undef REM
|
||||
|
||||
|
||||
/datum/reagent/Destroy()
|
||||
if(holder)
|
||||
holder.reagent_list -= src
|
||||
holder = null
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
!isturf(src.loc) || \
|
||||
!(locate(/obj/structure/table) in src.loc) && \
|
||||
!(locate(/obj/machinery/optable) in src.loc) && \
|
||||
!(locate(/obj/item/weapon/tray) in src.loc) \
|
||||
!(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \
|
||||
)
|
||||
user << "\red You cannot slice [src] here! You need a table or at least a tray to do it."
|
||||
return 1
|
||||
|
||||
@@ -46,7 +46,8 @@
|
||||
spray(A)
|
||||
|
||||
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
|
||||
|
||||
user.changeNext_move(CLICK_CD_RANGE*2)
|
||||
|
||||
if(reagents.has_reagent("sacid"))
|
||||
message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].")
|
||||
log_game("[key_name(user)] fired sulphuric acid from \a [src].")
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name = "Advanced Energy Gun"
|
||||
desc = "An energy gun with an experimental miniaturized reactor."
|
||||
id = "nuclear_gun"
|
||||
req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3)
|
||||
req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 2000)
|
||||
reliability_base = 76
|
||||
@@ -147,7 +147,7 @@
|
||||
id = "stunrevolver"
|
||||
req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 4000)
|
||||
materials = list("$metal" = 4000, "$glass" = 1000)
|
||||
build_path = /obj/item/weapon/gun/energy/stunrevolver
|
||||
locked = 1
|
||||
category = list("Weapons")
|
||||
|
||||
Reference in New Issue
Block a user