mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 02:54:41 +01:00
Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into DatumEmotesMK2
This commit is contained in:
@@ -123,8 +123,8 @@ Doesn't work on other aliens/AI.*/
|
||||
A.firer = src
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(1)
|
||||
A.process()
|
||||
A.fire()
|
||||
A.newtonian_move(get_dir(U, T))
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/resin() // -- TLE
|
||||
@@ -185,4 +185,4 @@ Doesn't work on other aliens/AI.*/
|
||||
adjustPlasma(-amount)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -32,22 +32,6 @@
|
||||
adjustToxLoss(3)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
var/environment_heat_capacity = environment.heat_capacity()
|
||||
if(istype(get_turf(src), /turf/space))
|
||||
var/turf/heat_turf = get_turf(src)
|
||||
environment_heat_capacity = heat_turf.heat_capacity
|
||||
|
||||
if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
|
||||
var/transfer_coefficient = 1
|
||||
|
||||
handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
|
||||
|
||||
if(stat == DEAD)
|
||||
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
@@ -94,3 +78,6 @@
|
||||
see_in_dark = 2
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
handle_hud_icons_health()
|
||||
|
||||
/mob/living/carbon/brain/breathe()
|
||||
return
|
||||
|
||||
@@ -517,57 +517,39 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
|
||||
/mob/living/carbon/throw_item(atom/target)
|
||||
throw_mode_off()
|
||||
if(stat || !target)
|
||||
if(!target || !isturf(loc))
|
||||
return
|
||||
if(target.type == /obj/screen)
|
||||
if(istype(target, /obj/screen))
|
||||
return
|
||||
|
||||
var/atom/movable/item = get_active_hand()
|
||||
var/atom/movable/thrown_thing
|
||||
var/obj/item/I = src.get_active_hand()
|
||||
|
||||
if(!item || (item.flags & NODROP))
|
||||
if(!I || (I.flags & NODROP))
|
||||
return
|
||||
|
||||
if (istype(item, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = item
|
||||
item = G.get_mob_if_throwable() //throw the person instead of the grab
|
||||
if(ismob(item))
|
||||
if(istype(I, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = I
|
||||
var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab
|
||||
qdel(G) //We delete the grab.
|
||||
if(throwable_mob)
|
||||
thrown_thing = throwable_mob
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
var/mob/M = item
|
||||
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
|
||||
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [key_name(src)] from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [key_name(M)] from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
msg_admin_attack("[key_name_admin(src)] has thrown [key_name_admin(M)] from [start_T_descriptor] with the target [end_T_descriptor]")
|
||||
add_logs(throwable_mob, src, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
|
||||
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = src
|
||||
|
||||
if(!item)
|
||||
return //Grab processing has a chance of returning null
|
||||
if(!ismob(item)) //Honk mobs don't have a dropped() proc honk
|
||||
unEquip(item)
|
||||
update_icons()
|
||||
|
||||
if (istype(src, /mob/living/carbon)) //Check if a carbon mob is throwing. Modify/remove this line as required.
|
||||
item.loc = loc
|
||||
if(client)
|
||||
client.screen -= item
|
||||
if(istype(item, /obj/item))
|
||||
item:dropped(src) // let it know it's been dropped
|
||||
|
||||
//actually throw it!
|
||||
if (item)
|
||||
item.layer = initial(item.layer)
|
||||
visible_message("\red [src] has thrown [item].")
|
||||
else if(!(I.flags & ABSTRACT)) //can't throw abstract items
|
||||
thrown_thing = I
|
||||
unEquip(I)
|
||||
|
||||
if(thrown_thing)
|
||||
visible_message("<span class='danger'>[src] has thrown [thrown_thing].</span>")
|
||||
newtonian_move(get_dir(target, src))
|
||||
|
||||
item.throw_at(target, item.throw_range, item.throw_speed, src)
|
||||
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
|
||||
/*
|
||||
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
..()
|
||||
@@ -863,6 +845,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
//called when we get cuffed/uncuffed
|
||||
/mob/living/carbon/proc/update_handcuffed()
|
||||
if(handcuffed)
|
||||
//we don't want problems with nodrop shit if there ever is more than one nodrop twohanded
|
||||
var/obj/item/I = get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/twohanded))
|
||||
var/obj/item/weapon/twohanded/TH = I //FML
|
||||
if(TH.wielded)
|
||||
TH.unwield()
|
||||
drop_r_hand()
|
||||
drop_l_hand()
|
||||
stop_pulling()
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no")
|
||||
if (species.name == "Machine") //Only Machines can beep, ping, and buzz
|
||||
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2")
|
||||
if (species.name == "Machine") //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
@@ -87,6 +87,11 @@
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if("buzz2")
|
||||
message = "<B>[src]</B> emits an irritated buzzing sound."
|
||||
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if("buzz", "buzzes")
|
||||
var/M = null
|
||||
if(param)
|
||||
|
||||
@@ -1982,4 +1982,21 @@
|
||||
. |= A.GetAccess()
|
||||
|
||||
/mob/living/carbon/human/is_mechanical()
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
|
||||
/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G)
|
||||
. = ..()
|
||||
|
||||
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
|
||||
if(HULK in mutations)
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
return 0
|
||||
if(species.flags & NOGUNS)
|
||||
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return 0
|
||||
|
||||
if(martial_art && martial_art.name == "The Sleeping Carp") //great dishonor to famiry
|
||||
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
|
||||
return 0
|
||||
|
||||
return .
|
||||
|
||||
@@ -27,7 +27,7 @@ emp_act
|
||||
P.current = curloc
|
||||
P.yo = new_y - curloc.y
|
||||
P.xo = new_x - curloc.x
|
||||
P.Angle = ""//round(Get_Angle(P,P.original))
|
||||
P.Angle = null
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
@@ -46,7 +46,10 @@ emp_act
|
||||
if((P.embed && prob(20 + max(P.damage - armor, -10))))
|
||||
var/obj/item/weapon/shard/shrapnel/SP = new()
|
||||
(SP.name) = "[P.name] shrapnel"
|
||||
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
if(P.ammo_casing && P.ammo_casing.caliber)
|
||||
(SP.desc) = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round."
|
||||
else
|
||||
(SP.desc) = "[SP.desc] The round's caliber is unidentifiable."
|
||||
(SP.loc) = organ
|
||||
organ.embed(SP)
|
||||
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
if(back)
|
||||
tally += back.slowdown
|
||||
|
||||
if(l_hand && (l_hand.flags & HANDSLOW))
|
||||
tally += l_hand.slowdown
|
||||
if(r_hand && (r_hand.flags & HANDSLOW))
|
||||
tally += r_hand.slowdown
|
||||
|
||||
if(FAT in src.mutations)
|
||||
tally += 1.5
|
||||
|
||||
@@ -693,7 +693,7 @@
|
||||
best = R
|
||||
if(istype(R, /obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = R
|
||||
if(G.can_fire())
|
||||
if(G.can_shoot())
|
||||
best = R
|
||||
break // gun with ammo? screw the rest
|
||||
if(best && best != main_hand)
|
||||
@@ -727,22 +727,23 @@
|
||||
if(main_hand.force != 0)
|
||||
if(istype(main_hand,/obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = main_hand
|
||||
if(G.special_check(src))
|
||||
if(G.can_trigger_gun(src))
|
||||
var/shouldFire = 1
|
||||
if(istype(main_hand, /obj/item/weapon/gun/energy))
|
||||
var/obj/item/weapon/gun/energy/P = main_hand
|
||||
var/stunning = 0
|
||||
if(ispath(text2path(P.projectile_type), /obj/item/projectile/energy/electrode))
|
||||
stunning = 1
|
||||
for(var/A in P.ammo_type)
|
||||
if(ispath(A,/obj/item/ammo_casing/energy/electrode))
|
||||
stunning = 1
|
||||
var/mob/stunCheck = TARGET
|
||||
if(stunning && stunCheck.stunned)
|
||||
shouldFire = 0
|
||||
if(shouldFire)
|
||||
if(!G.process_chambered())
|
||||
G.click_empty(src)
|
||||
if(!G.can_shoot())
|
||||
G.shoot_with_empty_chamber(src)
|
||||
npcDrop(G, 1)
|
||||
else
|
||||
G.Fire(TARGET, src)
|
||||
G.process_fire(TARGET, src)
|
||||
else
|
||||
if(get_dist(src,TARGET) > 6)
|
||||
if(!walk2derpless(TARGET))
|
||||
@@ -871,4 +872,4 @@
|
||||
else
|
||||
A.stamp(S)
|
||||
custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!")
|
||||
return
|
||||
return
|
||||
|
||||
@@ -148,6 +148,9 @@
|
||||
if(prob(braindam))
|
||||
message = uppertext(message)
|
||||
verb = "yells loudly"
|
||||
|
||||
if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
|
||||
message = "<span class='sans'>[message]</span>"
|
||||
|
||||
returns[1] = message
|
||||
returns[2] = verb
|
||||
|
||||
@@ -24,4 +24,6 @@
|
||||
H.gender = NEUTER
|
||||
if(H.mind)
|
||||
H.mind.abductor = new /datum/abductor
|
||||
return ..()
|
||||
H.languages.Cut() //Under no condition should you be able to speak any language
|
||||
H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink
|
||||
return ..()
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
if("Warden","Security Officer","Security Pod Pilot")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack)
|
||||
if("Magistrate")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
|
||||
|
||||
@@ -465,4 +465,4 @@
|
||||
else
|
||||
healths.icon_state = "health6"
|
||||
else
|
||||
healths.icon_state = "health7"
|
||||
healths.icon_state = "health7"
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
if(get_nations_mode())
|
||||
process_nations()
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/proc/handle_breathing()
|
||||
return
|
||||
|
||||
@@ -251,19 +253,17 @@
|
||||
/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0)
|
||||
if(I.action_button_name)
|
||||
if(!I.action)
|
||||
if(istype(I, /obj/item/organ/internal))
|
||||
I.action = new/datum/action/item_action/organ_action
|
||||
else if(I.action_button_is_hands_free)
|
||||
I.action = new/datum/action/item_action/hands_free
|
||||
if(I.action_button_custom_type)
|
||||
I.action = new I.action_button_custom_type
|
||||
else
|
||||
I.action = new/datum/action/item_action
|
||||
I.action = new /datum/action/item_action
|
||||
I.action.name = I.action_button_name
|
||||
I.action.target = I
|
||||
I.action.Grant(src)
|
||||
|
||||
if(recursive)
|
||||
for(var/obj/item/T in I)
|
||||
give_action_button(I, recursive - 1)
|
||||
give_action_button(T, recursive - 1)
|
||||
|
||||
/mob/living/update_action_buttons()
|
||||
if(!hud_used) return
|
||||
|
||||
@@ -855,3 +855,9 @@
|
||||
tally += 10
|
||||
|
||||
return tally
|
||||
|
||||
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
|
||||
if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
|
||||
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -47,10 +47,6 @@
|
||||
proj_sharp = 0
|
||||
proj_edge = 0
|
||||
|
||||
if(istype(P, /obj/item/projectile/beam/lightning)) //Stupid snowflake lightning gun.
|
||||
if(P.damage >= 200)
|
||||
src.dust()
|
||||
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, armor)
|
||||
return P.on_hit(src, armor, def_zone)
|
||||
|
||||
@@ -814,7 +814,8 @@ var/list/ai_verbs_default = list(
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"xeno queen"
|
||||
"xeno queen",
|
||||
"eldritch"
|
||||
)
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
if(input)
|
||||
@@ -826,6 +827,8 @@ var/list/ai_verbs_default = list(
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("xeno queen")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
|
||||
if("eldritch")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/proc/corereturn()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
//Cooldown-inducing emotes
|
||||
if("scream", "screams")
|
||||
on_CD = handle_emote_CD(50) //longer cooldown
|
||||
if("ping","pings","buzz","buzzs","buzzes","beep","beeps","yes","no")
|
||||
if("ping","pings","buzz","buzzs","buzzes","beep","beeps","yes","no", "buzz2")
|
||||
//halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
//Everything else, including typos of the above emotes
|
||||
@@ -116,8 +116,14 @@
|
||||
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
|
||||
m_type = 2
|
||||
|
||||
if("buzz2")
|
||||
message = "<B>[src]</B> emits an irritated buzzing sound."
|
||||
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
|
||||
if("help")
|
||||
to_chat(src, "yes, no, beep, ping, buzz")
|
||||
to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2")
|
||||
|
||||
..(act, m_type, message)
|
||||
*/
|
||||
@@ -246,4 +246,4 @@
|
||||
if(!module)
|
||||
hands.icon_state = "nomod"
|
||||
else
|
||||
hands.icon_state = lowertext(module.module_type)
|
||||
hands.icon_state = lowertext(module.module_type)
|
||||
|
||||
@@ -298,6 +298,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Bro"] = "Brobot"
|
||||
module_sprites["Rich"] = "maximillion"
|
||||
module_sprites["Default"] = "Service2"
|
||||
module_sprites["Standard"] = "robotServ"
|
||||
|
||||
if("Miner")
|
||||
module = new /obj/item/weapon/robot_module/miner(src)
|
||||
@@ -307,6 +308,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Basic"] = "Miner_old"
|
||||
module_sprites["Advanced Droid"] = "droid-miner"
|
||||
module_sprites["Treadhead"] = "Miner"
|
||||
module_sprites["Standard"] = "robotMine"
|
||||
|
||||
if("Medical")
|
||||
module = new /obj/item/weapon/robot_module/medical(src)
|
||||
@@ -317,6 +319,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Standard"] = "surgeon"
|
||||
module_sprites["Advanced Droid"] = "droid-medical"
|
||||
module_sprites["Needles"] = "medicalrobot"
|
||||
module_sprites["Standard"] = "robotMedi"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Security")
|
||||
@@ -326,6 +329,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Red Knight"] = "Security"
|
||||
module_sprites["Black Knight"] = "securityrobot"
|
||||
module_sprites["Bloodhound"] = "bloodhound"
|
||||
module_sprites["Standard"] = "robotSecy"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Engineering")
|
||||
@@ -336,6 +340,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Basic"] = "Engineering"
|
||||
module_sprites["Antique"] = "engineerrobot"
|
||||
module_sprites["Landmate"] = "landmate"
|
||||
module_sprites["Standard"] = "robotEngi"
|
||||
magpulse = 1
|
||||
|
||||
if("Janitor")
|
||||
@@ -344,6 +349,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Basic"] = "JanBot2"
|
||||
module_sprites["Mopbot"] = "janitorrobot"
|
||||
module_sprites["Mop Gear Rex"] = "mopgearrex"
|
||||
module_sprites["Standard"] = "robotJani"
|
||||
|
||||
if("Combat")
|
||||
module = new /obj/item/weapon/robot_module/combat(src)
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
src.modules += new /obj/item/device/flash/cyborg(src)
|
||||
src.modules += new /obj/item/borg/sight/thermal(src)
|
||||
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
|
||||
src.modules += new /obj/item/weapon/crowbar(src)
|
||||
src.emag = null
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
return
|
||||
newname = "redtag ED-209 assembly"
|
||||
if("")
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/advtaser))
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
|
||||
return
|
||||
newname = "taser ED-209 assembly"
|
||||
else
|
||||
|
||||
@@ -365,7 +365,7 @@ Auto Patrol[]"},
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
|
||||
if(!lasercolor)
|
||||
var/obj/item/weapon/gun/energy/advtaser/G = new /obj/item/weapon/gun/energy/advtaser(Tsec)
|
||||
var/obj/item/weapon/gun/energy/gun/advtaser/G = new /obj/item/weapon/gun/energy/gun/advtaser(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "b")
|
||||
@@ -403,7 +403,7 @@ Auto Patrol[]"},
|
||||
shoot_sound = 'sound/weapons/laser.ogg'
|
||||
if(emagged == 2)
|
||||
if(lasercolor)
|
||||
projectile = /obj/item/projectile/lasertag
|
||||
projectile = /obj/item/projectile/beam/lasertag
|
||||
else
|
||||
projectile = /obj/item/projectile/beam
|
||||
else
|
||||
@@ -411,9 +411,9 @@ Auto Patrol[]"},
|
||||
shoot_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile = /obj/item/projectile/energy/electrode
|
||||
else if(lasercolor == "b")
|
||||
projectile = /obj/item/projectile/lasertag/blue
|
||||
projectile = /obj/item/projectile/beam/lasertag/bluetag
|
||||
else if(lasercolor == "r")
|
||||
projectile = /obj/item/projectile/lasertag/red
|
||||
projectile = /obj/item/projectile/beam/lasertag/redtag
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
|
||||
if(lastfired && world.time - lastfired < shot_delay)
|
||||
@@ -438,8 +438,7 @@ Auto Patrol[]"},
|
||||
A.current = U
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(0)
|
||||
A.process()
|
||||
A.fire()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/attack_alien(mob/living/carbon/alien/user)
|
||||
..()
|
||||
@@ -491,10 +490,10 @@ Auto Patrol[]"},
|
||||
if(!disabled)
|
||||
var/lasertag_check = 0
|
||||
if((lasercolor == "b"))
|
||||
if(istype(Proj, /obj/item/projectile/lasertag/red))
|
||||
if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
|
||||
lasertag_check++
|
||||
else if((lasercolor == "r"))
|
||||
if(istype(Proj, /obj/item/projectile/lasertag/blue))
|
||||
if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
|
||||
lasertag_check++
|
||||
if(lasertag_check)
|
||||
icon_state = "[lasercolor]ed2090"
|
||||
|
||||
@@ -632,8 +632,7 @@
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
A.fire()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/pet/corgi/Ian/borgi/Life()
|
||||
@@ -657,4 +656,4 @@
|
||||
s.start()
|
||||
respawnable_list += src
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -118,8 +118,8 @@
|
||||
return 1
|
||||
if(istype(the_target, /obj/spacepod))
|
||||
var/obj/spacepod/S = the_target
|
||||
if(S.occupant || S.occupant2)//Just so we don't attack empty mechs
|
||||
if(CanAttack(S.occupant) || CanAttack(S.occupant2))
|
||||
if(S.pilot) //Just so we don't attack empty pods
|
||||
if(CanAttack(S.pilot))
|
||||
return 1
|
||||
if(isliving(the_target))
|
||||
var/mob/living/L = the_target
|
||||
@@ -262,7 +262,8 @@
|
||||
|
||||
var/obj/item/projectile/A = new projectiletype(src.loc)
|
||||
playsound(user, projectilesound, 100, 1)
|
||||
if(!A) return
|
||||
if(!A)
|
||||
return
|
||||
|
||||
A.current = target
|
||||
A.firer = src
|
||||
@@ -272,7 +273,7 @@
|
||||
newtonian_move(get_dir(target, user))
|
||||
A.original = target
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
A.fire()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
return A
|
||||
else if(istype(A, /obj/spacepod))
|
||||
var/obj/spacepod/M = A
|
||||
if(M.occupant || M.occupant2)
|
||||
if(M.pilot)
|
||||
return A
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ListTargets()
|
||||
@@ -47,9 +47,9 @@
|
||||
enemies |= M.occupant
|
||||
else if(istype(A, /obj/spacepod))
|
||||
var/obj/spacepod/M = A
|
||||
if(M.occupant || M.occupant2)
|
||||
if(M.pilot)
|
||||
enemies |= M
|
||||
enemies |= M.occupant
|
||||
enemies |= M.pilot
|
||||
|
||||
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
|
||||
var/retaliate_faction_check = 0
|
||||
|
||||
@@ -36,7 +36,11 @@
|
||||
small = 1
|
||||
can_collar = 1
|
||||
|
||||
speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me")
|
||||
var/list/clean_speak = list(
|
||||
"Hi",
|
||||
"Hello!",
|
||||
"Cracker?",
|
||||
"BAWWWWK george mellons griffing me")
|
||||
speak_emote = list("squawks","says","yells")
|
||||
emote_hear = list("squawks","bawks")
|
||||
emote_see = list("flutters its wings")
|
||||
@@ -95,6 +99,7 @@
|
||||
/obj/item/device/radio/headset/headset_sci, \
|
||||
/obj/item/device/radio/headset/headset_cargo)
|
||||
ears = new headset(src)
|
||||
update_speak()
|
||||
|
||||
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
|
||||
|
||||
@@ -153,14 +158,12 @@
|
||||
if("ears")
|
||||
if(ears)
|
||||
if(available_channels.len)
|
||||
src.say("[pick(available_channels)]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
say("[pick(available_channels)]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
else
|
||||
src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
ears.loc = src.loc
|
||||
say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
ears.forceMove(loc)
|
||||
ears = null
|
||||
for(var/possible_phrase in speak)
|
||||
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||
possible_phrase = copytext(possible_phrase,3,length(possible_phrase))
|
||||
update_speak()
|
||||
else
|
||||
to_chat(usr, "\red There is nothing to remove from its [remove_from].")
|
||||
return
|
||||
@@ -187,11 +190,11 @@
|
||||
var/obj/item/device/radio/headset/headset_to_add = item_to_add
|
||||
|
||||
usr.drop_item()
|
||||
headset_to_add.loc = src
|
||||
src.ears = headset_to_add
|
||||
headset_to_add.forceMove(src)
|
||||
ears = headset_to_add
|
||||
to_chat(usr, "You fit the headset onto [src].")
|
||||
|
||||
clearlist(available_channels)
|
||||
available_channels.Cut()
|
||||
for(var/ch in headset_to_add.channels)
|
||||
switch(ch)
|
||||
if("Engineering")
|
||||
@@ -211,6 +214,7 @@
|
||||
|
||||
if(headset_to_add.translate_binary)
|
||||
available_channels.Add(":b")
|
||||
update_speak()
|
||||
show_inv(usr)
|
||||
else
|
||||
..()
|
||||
@@ -279,7 +283,19 @@
|
||||
if(pulledby && stat == CONSCIOUS)
|
||||
icon_state = "parrot_fly"
|
||||
|
||||
/mob/living/simple_animal/parrot/process_ai()
|
||||
/mob/living/simple_animal/parrot/proc/update_speak()
|
||||
speak.Cut()
|
||||
|
||||
if(available_channels.len && ears)
|
||||
for(var/possible_phrase in clean_speak)
|
||||
//50/50 chance to not use the radio at all
|
||||
speak += "[prob(50) ? pick(available_channels) : ""][possible_phrase]"
|
||||
|
||||
else //If we have no headset or channels to use, dont try to use any!
|
||||
for(var/possible_phrase in clean_speak)
|
||||
speak += possible_phrase
|
||||
|
||||
/mob/living/simple_animal/parrot/handle_automated_movement()
|
||||
if(pulledby)
|
||||
parrot_state = PARROT_WANDER
|
||||
return
|
||||
@@ -294,11 +310,11 @@
|
||||
Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
|
||||
Then it clears the buffer to make sure they dont magically remember something from hours ago. */
|
||||
if(speech_buffer.len && prob(10))
|
||||
if(speak.len)
|
||||
speak.Remove(pick(speak))
|
||||
if(clean_speak.len)
|
||||
clean_speak -= pick(clean_speak)
|
||||
|
||||
speak.Add(pick(speech_buffer))
|
||||
clearlist(speech_buffer)
|
||||
clean_speak += pick(speech_buffer)
|
||||
speech_buffer.Cut()
|
||||
|
||||
|
||||
//-----SLEEPING
|
||||
@@ -321,30 +337,7 @@
|
||||
parrot_sleep_dur = parrot_sleep_max
|
||||
|
||||
//Cycle through message modes for the headset
|
||||
if(speak.len)
|
||||
var/list/newspeak = list()
|
||||
|
||||
if(available_channels.len && src.ears)
|
||||
for(var/possible_phrase in speak)
|
||||
|
||||
//50/50 chance to not use the radio at all
|
||||
var/useradio = 0
|
||||
if(prob(50))
|
||||
useradio = 1
|
||||
|
||||
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||
possible_phrase = "[useradio?pick(available_channels):""][copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
|
||||
else
|
||||
possible_phrase = "[useradio?pick(available_channels):""][possible_phrase]"
|
||||
|
||||
newspeak.Add(possible_phrase)
|
||||
|
||||
else //If we have no headset or channels to use, dont try to use any!
|
||||
for(var/possible_phrase in speak)
|
||||
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||
possible_phrase = "[copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
|
||||
newspeak.Add(possible_phrase)
|
||||
speak = newspeak
|
||||
update_speak()
|
||||
|
||||
//Search for item to steal
|
||||
parrot_interest = search_for_item()
|
||||
@@ -686,7 +679,14 @@
|
||||
/mob/living/simple_animal/parrot/Poly
|
||||
name = "Poly"
|
||||
desc = "Poly the Parrot. An expert on quantum cracker theory."
|
||||
speak = list("Poly wanna cracker!", ":eCheck the singlo, you chucklefucks!",":eCheck the tesla, you shits!",":eSTOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":eWire the solars, you lazy bums!",":eWHO TOOK THE DAMN HARDSUITS?",":eOH GOD ITS FREE CALL THE SHUTTLE")
|
||||
clean_speak = list(
|
||||
"Poly wanna cracker!",
|
||||
"Check the singlo, you chucklefucks!",
|
||||
"Check the tesla, you shits!",
|
||||
"STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE")
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/New()
|
||||
@@ -700,15 +700,15 @@
|
||||
used_radios += ears
|
||||
|
||||
/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
|
||||
if(prob(50))
|
||||
if(speaker != src && prob(50))
|
||||
parrot_hear(html_decode(message))
|
||||
..()
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/atom/follow_target)
|
||||
if(prob(50))
|
||||
parrot_hear("[pick(available_channels)][html_decode(message)]")
|
||||
if(speaker != src && prob(50))
|
||||
parrot_hear(html_decode(message))
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -536,7 +536,7 @@
|
||||
return 0
|
||||
if (istype(the_target,/obj/spacepod))
|
||||
var/obj/spacepod/S = the_target
|
||||
if (S.occupant || S.occupant2)
|
||||
if (S.pilot)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -65,15 +65,26 @@
|
||||
if ((O.client && !( O.blinded )))
|
||||
to_chat(O, "\red [src] launches a razor-sharp quill at [target]!")
|
||||
|
||||
var/obj/item/weapon/arrow/quill/Q = new(loc)
|
||||
var/obj/item/weapon/quill/Q = new(loc)
|
||||
Q.fingerprintslast = src.ckey
|
||||
Q.throw_at(target,10,30)
|
||||
|
||||
quills--
|
||||
|
||||
spawn(100)
|
||||
to_chat(src, "\red You feel a fresh quill slide into place.")
|
||||
quills++
|
||||
|
||||
/obj/item/weapon/quill
|
||||
name = "vox quill"
|
||||
desc = "A wickedly barbed quill from some bizarre animal."
|
||||
icon_state = "quill"
|
||||
item_state = "quill"
|
||||
throwforce = 5
|
||||
w_class = 3.0
|
||||
sharp = 1
|
||||
edge = 0
|
||||
|
||||
/mob/living/simple_animal/vox/armalis/verb/message_mob()
|
||||
set category = "Alien"
|
||||
set name = "Commune with creature"
|
||||
@@ -155,4 +166,4 @@
|
||||
desc = "A series of metallic lenses and chains."
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
icon_state = "amp"
|
||||
item_state = "amp"
|
||||
item_state = "amp"
|
||||
|
||||
@@ -93,13 +93,15 @@
|
||||
hud.screen_loc = ui_rhand
|
||||
else
|
||||
hud.screen_loc = ui_lhand
|
||||
|
||||
assailant.client.screen += hud
|
||||
|
||||
/obj/item/weapon/grab/process()
|
||||
if(!confirm()) return //If the confirm fails, the grab is about to be deleted. That means it shouldn't continue processing.
|
||||
if(!confirm())
|
||||
return //If the confirm fails, the grab is about to be deleted. That means it shouldn't continue processing.
|
||||
|
||||
if(assailant.client)
|
||||
if(!hud) return //this somehow can runtime under the right circumstances
|
||||
if(!hud)
|
||||
return //this somehow can runtime under the right circumstances
|
||||
assailant.client.screen -= hud
|
||||
assailant.client.screen += hud
|
||||
|
||||
@@ -136,12 +138,8 @@
|
||||
hud.icon_state = "!reinforce"
|
||||
|
||||
if(state >= GRAB_AGGRESSIVE)
|
||||
var/h = affecting.hand
|
||||
affecting.hand = 0
|
||||
affecting.drop_item()
|
||||
affecting.hand = 1
|
||||
affecting.drop_item()
|
||||
affecting.hand = h
|
||||
affecting.drop_r_hand()
|
||||
affecting.drop_l_hand()
|
||||
|
||||
|
||||
//var/announce = 0
|
||||
@@ -440,7 +438,13 @@
|
||||
affecting.pixel_y = 0 //used to be an animate, not quick enough for del'ing
|
||||
affecting.layer = initial(affecting.layer)
|
||||
affecting.grabbed_by -= src
|
||||
affecting = null
|
||||
if(assailant)
|
||||
if(assailant.client)
|
||||
assailant.client.screen -= hud
|
||||
assailant = null
|
||||
qdel(hud)
|
||||
hud = null
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
@@ -304,26 +304,38 @@
|
||||
///Called by client/Move()
|
||||
///Checks to see if you are being grabbed and if so attemps to break it
|
||||
/client/proc/Process_Grab()
|
||||
if(locate(/obj/item/weapon/grab, locate(/obj/item/weapon/grab, mob.grabbed_by.len)))
|
||||
if(mob.grabbed_by.len)
|
||||
var/list/grabbing = list()
|
||||
|
||||
if(istype(mob.l_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = mob.l_hand
|
||||
grabbing += G.affecting
|
||||
|
||||
if(istype(mob.r_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = mob.r_hand
|
||||
grabbing += G.affecting
|
||||
for(var/obj/item/weapon/grab/G in mob.grabbed_by)
|
||||
if((G.state == 1)&&(!grabbing.Find(G.assailant))) qdel(G)
|
||||
if(G.state == 2)
|
||||
move_delay = world.time + 10
|
||||
if(!prob(25)) return 1
|
||||
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
|
||||
qdel(G)
|
||||
if(G.state == 3)
|
||||
move_delay = world.time + 10
|
||||
if(!prob(5)) return 1
|
||||
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
|
||||
qdel(G)
|
||||
|
||||
for(var/X in mob.grabbed_by)
|
||||
var/obj/item/weapon/grab/G = X
|
||||
switch(G.state)
|
||||
|
||||
if(GRAB_PASSIVE)
|
||||
if(!grabbing.Find(G.assailant)) //moving always breaks a passive grab unless we are also grabbing our grabber.
|
||||
qdel(G)
|
||||
|
||||
if(GRAB_AGGRESSIVE)
|
||||
move_delay = world.time + 10
|
||||
if(!prob(25))
|
||||
return 1
|
||||
mob.visible_message("<span class='danger'>[mob] has broken free of [G.assailant]'s grip!</span>")
|
||||
qdel(G)
|
||||
|
||||
if(GRAB_NECK)
|
||||
move_delay = world.time + 10
|
||||
if(!prob(5))
|
||||
return 1
|
||||
mob.visible_message("<span class='danger'>[mob] has broken free of [G.assailant]'s headlock!</span>")
|
||||
qdel(G)
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -34,10 +34,6 @@
|
||||
verbs += /client/proc/readmin
|
||||
spawn(40)
|
||||
if(client)
|
||||
if(client.prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
|
||||
winset(client, "rpane.changelog", "background-color=#f4aa94;font-style=bold")
|
||||
client.prefs.SetChangelog(client,changelog_hash)
|
||||
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
|
||||
client.playtitlemusic()
|
||||
|
||||
if(config.player_overflow_cap && config.overflow_server_url) //Overflow rerouting, if set, forces players to be moved to a different server once a player cap is reached. Less rough than a pure kick.
|
||||
|
||||
@@ -446,14 +446,14 @@
|
||||
chosen_species = all_species[client.prefs.species]
|
||||
if(!(chosen_species && (is_species_whitelisted(chosen_species) || has_admin_rights())))
|
||||
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
||||
log_to_dd("[src] had species [client.prefs.species], though they weren't supposed to. Setting to Human.")
|
||||
log_debug("[src] had species [client.prefs.species], though they weren't supposed to. Setting to Human.")
|
||||
client.prefs.species = "Human"
|
||||
|
||||
var/datum/language/chosen_language
|
||||
if(client.prefs.language)
|
||||
chosen_language = all_languages[client.prefs.language]
|
||||
if(!((chosen_language || client.prefs.language == "None") && (is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED))))
|
||||
log_to_dd("[src] had language [client.prefs.language], though they weren't supposed to. Setting to None.")
|
||||
if((chosen_language == null && client.prefs.language != "None") || (chosen_language && chosen_language.flags & RESTRICTED))
|
||||
log_debug("[src] had language [client.prefs.language], though they weren't supposed to. Setting to None.")
|
||||
client.prefs.language = "None"
|
||||
|
||||
/mob/new_player/proc/ViewManifest()
|
||||
|
||||
Reference in New Issue
Block a user