Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into DatumEmotesMK2

This commit is contained in:
VampyrBytes
2016-06-13 18:27:01 +01:00
412 changed files with 9085 additions and 5634 deletions
@@ -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
+3 -16
View File
@@ -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
+24 -36
View File
@@ -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)
+18 -1
View File
@@ -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
+1 -1
View File
@@ -465,4 +465,4 @@
else
healths.icon_state = "health6"
else
healths.icon_state = "health7"
healths.icon_state = "health7"
+6 -6
View File
@@ -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
+6
View File
@@ -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)
+4 -1
View File
@@ -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()
+8 -2
View File
@@ -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
+43 -43
View File
@@ -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
+13 -2
View File
@@ -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"
+13 -9
View File
@@ -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 ..()
+25 -13
View File
@@ -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
-4
View File
@@ -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.
+3 -3
View File
@@ -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()