Conflicts 2/3

This commit is contained in:
Xhuis
2015-10-14 21:56:18 -04:00
78 changed files with 637 additions and 522 deletions
+1 -1
View File
@@ -83,7 +83,7 @@
body += "<a href='?_src_=holder;subtlemessage="+ref+"'>SM</a> - "
body += "<a href='?_src_=holder;adminplayerobservefollow="+ref+"'>FLW</a><br>"
if(antagonist > 0)
body += "<font size='2'><a href='?_src_=holder;secretsadmin=check_antagonist'><font color='red'><b>Antagonist</b></font></a></font>";
body += "<font size='2'><a href='?_src_=holder;secrets=check_antagonist'><font color='red'><b>Antagonist</b></font></a></font>";
body += "</td></tr></table>";
+5 -5
View File
@@ -276,7 +276,7 @@
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station</span>")
href_list["secretsadmin"] = "check_antagonist"
href_list["secrets"] = "check_antagonist"
else if(href_list["edit_shuttle_time"])
if(!check_rights(R_SERVER)) return
@@ -286,7 +286,7 @@
log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
minor_announce("The emergency shuttle will reach its destination in [round(SSshuttle.emergency.timeLeft(600))] minutes.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds</span>")
href_list["secretsadmin"] = "check_antagonist"
href_list["secrets"] = "check_antagonist"
else if(href_list["toggle_continuous"])
if(!check_rights(R_ADMIN)) return
@@ -347,7 +347,7 @@
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("<span class='adminnotice'>[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].</span>")
href_list["secretsadmin"] = "check_antagonist"
href_list["secrets"] = "check_antagonist"
else if(href_list["end_round"])
if(!check_rights(R_ADMIN)) return
@@ -1595,7 +1595,7 @@
src.owner << "Name = <b>[M.name]</b>; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = <b>[M.key]</b>;"
src.owner << "Location = [location_description];"
src.owner << "[special_role_description]"
src.owner << "(<a href='?priv_msg=[M.ckey]'>PM</a>) (<A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[M]'>VV</A>) (<A HREF='?src=\ref[src];subtlemessage=\ref[M]'>SM</A>) (<A HREF='?src=\ref[src];adminplayerobservefollow=\ref[M]'>FLW</A>) (<A HREF='?src=\ref[src];secretsadmin=check_antagonist'>CA</A>)"
src.owner << "(<a href='?priv_msg=[M.ckey]'>PM</a>) (<A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[M]'>VV</A>) (<A HREF='?src=\ref[src];subtlemessage=\ref[M]'>SM</A>) (<A HREF='?src=\ref[src];adminplayerobservefollow=\ref[M]'>FLW</A>) (<A HREF='?src=\ref[src];secrets=check_antagonist'>CA</A>)"
else if(href_list["addjobslot"])
if(!check_rights(R_ADMIN)) return
@@ -1673,7 +1673,7 @@
else if(href_list["BlueSpaceArtillery"])
var/mob/living/M = locate(href_list["BlueSpaceArtillery"])
M.client.bluespace_artillery(M)
usr.client.bluespace_artillery(M)
else if(href_list["CentcommReply"])
var/mob/living/carbon/human/H = locate(href_list["CentcommReply"])
+4
View File
@@ -149,6 +149,10 @@
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]")
/proc/admin_forcemove(mob/mover, atom/newloc)
if(mover.buckled)
mover.buckled.unbuckle_mob()
if(mover.buckled_mob)
mover.unbuckle_mob(force=1)
mover.loc = newloc
mover.on_forcemove(newloc)
+1 -1
View File
@@ -73,7 +73,7 @@
item_color = "atmos"
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
flags = STOPSPRESSUREDMAGE
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
+3 -1
View File
@@ -231,7 +231,9 @@
if(!F)
return
var/mob/living/carbon/human/user = usr
var/mob/user = usr
if(user.incapacitated())
return
if(!isturf(user.loc))
user << "<span class='warning'>You cannot turn the light on while in this [user.loc]!</span>"
F.on = !F.on
@@ -226,7 +226,6 @@ Contains:
item_state = "space"
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flash_protect = 0
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
/obj/item/clothing/head/helmet/space/freedom
+80
View File
@@ -0,0 +1,80 @@
/datum/round_event_control/operative
name = "Lone Operative"
typepath = /datum/round_event/operative
weight = 0 //Admin only
max_occurrences = 1
/datum/round_event/operative
var/key_of_operative
/datum/round_event/operative/proc/get_operative(end_if_fail = 0)
key_of_operative = null
if(!key_of_operative)
var/list/candidates = get_candidates(BE_OPERATIVE)
if(!candidates.len)
if(end_if_fail)
return 0
return find_operative()
var/client/C = pick(candidates)
key_of_operative = C.key
if(!key_of_operative)
if(end_if_fail)
return 0
return find_operative()
var/datum/mind/player_mind = new /datum/mind(key_of_operative)
player_mind.active = 1
var/list/spawn_locs = list()
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name in list("ninjaspawn","carpspawn"))
spawn_locs += L.loc
if(!spawn_locs.len)
return kill()
var/mob/living/carbon/human/operative = new(pick(spawn_locs))
var/datum/preferences/A = new
A.copy_to(operative)
operative.dna.update_dna_identity()
operative.equipOutfit(/datum/outfit/syndicate/full)
var/datum/mind/Mind = new /datum/mind(key_of_operative)
Mind.assigned_role = "Lone Operative"
Mind.special_role = "Lone Operative"
ticker.mode.traitors |= Mind
Mind.active = 1
var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in machines
if(nuke)
var/nuke_code
if(!nuke.r_code || nuke.r_code == "ADMIN")
nuke_code = "[rand(10000, 99999)]"
nuke.r_code = nuke_code
else
nuke_code = nuke.r_code
Mind.store_memory("<B>Station Self-Destruct Device Code</B>: [nuke_code]", 0, 0)
Mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
var/datum/objective/nuclear/O = new()
O.owner = Mind
Mind.objectives += O
Mind.transfer_to(operative)
message_admins("[key_of_operative] has been made into lone operative by an event.")
log_game("[key_of_operative] was spawned as a lone operative by an event.")
return 1
/datum/round_event/operative/start()
get_operative()
/datum/round_event/operative/proc/find_operative()
message_admins("Attempted to spawn a operative but there was no players available. Will try again momentarily.")
spawn(50)
if(get_operative(1))
message_admins("Situation has been resolved, [key_of_operative] has been spawned as a operative.")
log_game("[key_of_operative] was spawned as a operative by an event.")
return 0
message_admins("Unfortunately, no candidates were available for becoming a operative. Shutting down.")
return kill()
+3 -3
View File
@@ -477,7 +477,7 @@
if(prob(20))
SV.grow()
else //If tile is fully grown
SV.buckle_mob()
SV.entangle_mob()
//if(prob(25))
SV.spread()
@@ -501,14 +501,14 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_grow(src)
/obj/effect/spacevine/buckle_mob()
/obj/effect/spacevine/proc/entangle_mob()
if(!buckled_mob && prob(25))
for(var/mob/living/carbon/V in src.loc)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_buckle(src, V)
if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
..(V)
buckle_mob(V)
break //only capture one mob at a time
/obj/effect/spacevine/proc/spread()
+2
View File
@@ -58,6 +58,8 @@
remove_effect()
owner.light = null
owner = null
if(changed)
SSlighting.changed_lights -= src
return ..()
//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one
@@ -1,4 +1,4 @@
/mob/living/carbon/alien/larva/emote(var/act)
/mob/living/carbon/alien/larva/emote(act,m_type=1,message = null)
var/param = null
if (findtext(act, "-", 1, null))
@@ -7,8 +7,6 @@
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
switch(act) //Alphabetically sorted please.
if ("burp","burps")
@@ -26,6 +24,9 @@
if (!src.restrained())
message = "<span class='name'>[src]</span> dances around happily."
m_type = 1
if ("deathgasp","deathgasps")
message = "<span class='name'>[src]</span> lets out a sickly hiss of air and falls limply to the floor..."
m_type = 2
if ("drool","drools")
message = "<span class='name'>[src]</span> drools."
m_type = 1
@@ -42,6 +43,9 @@
if ("jump","jumps")
message = "<span class='name'>[src]</span> jumps!"
m_type = 1
if ("me")
..()
return
if ("moan","moans")
message = "<span class='name'>[src]</span> moans!"
m_type = 2
@@ -95,7 +99,7 @@
m_type = 2
if ("help") //"The exception"
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, roar, scratch, screech, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, deathgasp, drool, gasp, gnarl, hiss, jump, me, moan, nod, roll, roar, scratch, screech, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
else
src << "<span class='info'>Unusable emote '[act]'. Say *help for a list.</span>"
@@ -106,4 +110,4 @@
visible_message(message)
else
audible_message(message)
return
return
@@ -60,7 +60,7 @@ emp_act
return -1 // complete projectile permutation
if(check_shields(P.damage, "the [P.name]", P))
if(check_shields(P.damage, "the [P.name]", P, 0, P.armour_penetration))
P.on_hit(src, 100, def_zone)
return 2
return (..(P , def_zone))
@@ -80,8 +80,9 @@ emp_act
//End Here
/mob/living/carbon/human/proc/check_shields(damage = 0, attack_text = "the attack", atom/movable/AM, thrown_proj = 0)
/mob/living/carbon/human/proc/check_shields(damage = 0, attack_text = "the attack", atom/movable/AM, thrown_proj = 0, armour_penetration = 0)
var/block_chance = 50 + 30*thrown_proj - round(damage / 3) //thrown things are easier to block
block_chance -= armour_penetration
if(AM)
if(AM.flags & NOSHIELD) //weapon ignores shields altogether
return 0
@@ -295,12 +296,12 @@ emp_act
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(check_shields(damage, "the [M.name]"))
if(check_shields(damage, "the [M.name]", "", "", M.armour_penetration))
return 0
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
var/armor = run_armor_check(affecting, "melee")
apply_damage(damage, M.melee_damage_type, affecting, armor)
apply_damage(damage, M.melee_damage_type, affecting, armor, "", "", M.armour_penetration)
updatehealth()
@@ -85,12 +85,56 @@
return null
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
/mob/living/carbon/human/equip_to_slot(obj/item/I, slot)
if(!..()) //a check failed or the item has already found its slot
return
switch(slot)
if(slot_belt)
belt = I
update_inv_belt()
if(slot_wear_id)
wear_id = I
sec_hud_set_ID()
update_inv_wear_id()
if(slot_ears)
ears = I
update_inv_ears()
if(slot_glasses)
glasses = I
update_inv_glasses()
if(slot_gloves)
gloves = I
update_inv_gloves()
if(slot_shoes)
shoes = I
update_inv_shoes()
if(slot_wear_suit)
wear_suit = I
if(I.flags_inv & HIDEJUMPSUIT)
update_inv_w_uniform()
update_inv_wear_suit()
if(slot_w_uniform)
w_uniform = I
update_suit_sensors()
update_inv_w_uniform()
if(slot_l_store)
l_store = I
update_inv_pockets()
if(slot_r_store)
r_store = I
update_inv_pockets()
if(slot_s_store)
s_store = I
update_inv_s_store()
else
src << "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>"
/mob/living/carbon/human/unEquip(obj/item/I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
if(I == wear_suit)
if(s_store)
unEquip(s_store, 1) //It makes no sense for your suit storage to stay on you if you drop your suit.
@@ -125,16 +169,6 @@
else if(I == belt)
belt = null
update_inv_belt()
else if(I == wear_mask)
wear_mask = null
if(I.flags & BLOCKHAIR)
update_hair() //rebuild hair
if(internal)
if(internals)
internals.icon_state = "internal0"
internal = null
sec_hud_set_ID()
update_inv_wear_mask()
else if(I == wear_id)
wear_id = null
sec_hud_set_ID()
@@ -149,95 +183,27 @@
s_store = null
update_inv_s_store()
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1)
if(!slot) return
if(!istype(I)) return
/mob/living/carbon/human/wear_mask_update(obj/item/I, unequip = 1)
if(I.flags & BLOCKHAIR)
update_hair()
if(unequip && internal)
if(internals)
internals.icon_state = "internal0"
internal = null
sec_hud_set_ID()
..()
/mob/living/carbon/human/head_update(obj/item/I)
if(I.flags & BLOCKHAIR)
update_hair()
if(I.flags_inv & HIDEEYES)
update_inv_glasses()
if(I.flags_inv & HIDEEARS)
update_body()
..()
if(I == l_hand)
l_hand = null
else if(I == r_hand)
r_hand = null
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
I.layer = 20
switch(slot)
if(slot_back)
back = I
update_inv_back(redraw_mob)
if(slot_wear_mask)
wear_mask = I
if(wear_mask.flags & BLOCKHAIR)
update_hair(redraw_mob) //rebuild hair
sec_hud_set_ID()
update_inv_wear_mask(redraw_mob)
if(slot_handcuffed)
handcuffed = I
update_inv_handcuffed(redraw_mob)
if(slot_legcuffed)
legcuffed = I
update_inv_legcuffed(redraw_mob)
if(slot_l_hand)
l_hand = I
update_inv_l_hand(redraw_mob)
if(slot_r_hand)
r_hand = I
update_inv_r_hand(redraw_mob)
if(slot_belt)
belt = I
update_inv_belt(redraw_mob)
if(slot_wear_id)
wear_id = I
sec_hud_set_ID()
update_inv_wear_id(redraw_mob)
if(slot_ears)
ears = I
update_inv_ears(redraw_mob)
if(slot_glasses)
glasses = I
update_inv_glasses(redraw_mob)
if(slot_gloves)
gloves = I
update_inv_gloves(redraw_mob)
if(slot_head)
head = I
if(head.flags & BLOCKHAIR)
update_hair(redraw_mob) //rebuild hair
if(head.flags_inv & HIDEEARS)
update_body(redraw_mob)
update_inv_head(redraw_mob)
if(slot_shoes)
shoes = I
update_inv_shoes(redraw_mob)
if(slot_wear_suit)
wear_suit = I
if(I.flags_inv & HIDEJUMPSUIT)
update_inv_w_uniform()
update_inv_wear_suit(redraw_mob)
if(slot_w_uniform)
w_uniform = I
update_suit_sensors()
update_inv_w_uniform(redraw_mob)
if(slot_l_store)
l_store = I
update_inv_pockets(redraw_mob)
if(slot_r_store)
r_store = I
update_inv_pockets(redraw_mob)
if(slot_s_store)
s_store = I
update_inv_s_store(redraw_mob)
if(slot_in_backpack)
if(get_active_hand() == I)
unEquip(I)
I.loc = back
else
src << "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>"
return
//Cycles through all clothing slots and tests them for destruction
/mob/living/carbon/human/proc/shred_clothing(bomb,shock)
@@ -308,7 +308,7 @@
bodyparts_to_add -= "waggingspines"
if("snout" in mutant_bodyparts) //Take a closer look at that snout!
if(H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE))
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)))
bodyparts_to_add -= "snout"
if("frills" in mutant_bodyparts)
@@ -998,7 +998,7 @@
// Allows you to put in item-specific reactions based on species
if(user != H)
user.do_attack_animation(H)
if(H.check_shields(I.force, "the [I.name]", I))
if(H.check_shields(I.force, "the [I.name]", I, 0, I.armour_penetration))
return 0
if(I.attack_verb && I.attack_verb.len)
@@ -275,19 +275,20 @@ Please contact me on #coderbus IRC. ~Carnie x
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
client.screen += glasses //Either way, add the item to the HUD
var/layer2use
if(glasses.alternate_worn_layer)
layer2use = glasses.alternate_worn_layer
if(!layer2use)
layer2use = GLASSES_LAYER
if(!(head && (head.flags_inv & HIDEEYES)))
var/layer2use
if(glasses.alternate_worn_layer)
layer2use = glasses.alternate_worn_layer
if(!layer2use)
layer2use = GLASSES_LAYER
var/image/standing
if(glasses.alternate_worn_icon)
standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-layer2use)
if(!standing)
standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-layer2use)
var/image/standing
if(glasses.alternate_worn_icon)
standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-layer2use)
if(!standing)
standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-layer2use)
overlays_standing[GLASSES_LAYER] = standing
overlays_standing[GLASSES_LAYER] = standing
apply_overlay(GLASSES_LAYER)
+59 -7
View File
@@ -17,24 +17,67 @@
return null
/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..() AND THAT COST ME AN ENTIRE DAY OF DEBUGGING.
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
/mob/living/carbon/equip_to_slot(obj/item/I, slot)
if(!slot)
return
if(!istype(I))
return
if(I == l_hand)
l_hand = null
else if(I == r_hand)
r_hand = null
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
I.layer = 20
switch(slot)
if(slot_back)
back = I
update_inv_back()
if(slot_wear_mask)
wear_mask = I
wear_mask_update(I, unequip=0)
if(slot_head)
head = I
head_update(I)
if(slot_handcuffed)
handcuffed = I
update_inv_handcuffed()
if(slot_legcuffed)
legcuffed = I
update_inv_legcuffed()
if(slot_l_hand)
l_hand = I
update_inv_l_hand()
if(slot_r_hand)
r_hand = I
update_inv_r_hand()
if(slot_in_backpack)
if(I == get_active_hand())
unEquip(I)
I.loc = back
else
return 1
/mob/living/carbon/unEquip(obj/item/I)
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
return
if(I == head)
head = null
if(I.flags & BLOCKHAIR)
update_hair()
update_inv_head()
head_update(I)
else if(I == back)
back = null
update_inv_back()
else if(I == wear_mask)
if(istype(src, /mob/living/carbon/human)) //If we don't do this hair won't be properly rebuilt.
return
wear_mask = null
update_inv_wear_mask()
wear_mask_update(I, unequip=1)
else if(I == handcuffed)
handcuffed = null
if(buckled && buckled.buckle_requires_restraints)
@@ -44,3 +87,12 @@
legcuffed = null
update_inv_legcuffed()
//handle stuff to update when a mob equips/unequips a mask.
/mob/living/carbon/proc/wear_mask_update(obj/item/I, unequip = 1)
update_inv_wear_mask()
//handle stuff to update when a mob equips/unequips a headgear.
/mob/living/carbon/proc/head_update(obj/item/I)
if(I.flags_inv & HIDEMASK)
update_inv_wear_mask()
update_inv_head()
@@ -29,57 +29,4 @@
return 0 //Unsupported slot
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
/mob/living/carbon/monkey/equip_to_slot(obj/item/I, slot, redraw_mob = 1)
if(!slot) return
if(!istype(I)) return
if(I == l_hand)
l_hand = null
else if(I == r_hand)
r_hand = null
switch(slot)
if(slot_back)
back = I
I.equipped(src, slot)
update_inv_back(redraw_mob)
if(slot_wear_mask)
wear_mask = I
I.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
if(slot_head)
head = I
I.equipped(src, slot)
update_inv_head(redraw_mob)
if(slot_handcuffed)
handcuffed = I
update_inv_handcuffed(redraw_mob)
if(slot_legcuffed)
legcuffed = I
I.equipped(src, slot)
update_inv_legcuffed(redraw_mob)
if(slot_l_hand)
l_hand = I
I.equipped(src, slot)
update_inv_l_hand(redraw_mob)
if(slot_r_hand)
r_hand = I
I.equipped(src, slot)
update_inv_r_hand(redraw_mob)
if(slot_in_backpack)
if(I == get_active_hand())
unEquip(I)
I.loc = back
return
else
usr << "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder.</span>"
return
I.loc = src
I.equipped(src, slot)
I.layer = 20
+15 -13
View File
@@ -101,24 +101,26 @@
/mob/living/carbon/update_inv_wear_mask()
remove_overlay(FACEMASK_LAYER)
if(istype(wear_mask, /obj/item/clothing/mask))
var/layer2use
if(wear_mask.alternate_worn_layer)
layer2use = wear_mask.alternate_worn_layer
if(!layer2use)
layer2use = FACEMASK_LAYER
if(!(head && (head.flags_inv & HIDEMASK)))
var/layer2use
if(wear_mask.alternate_worn_layer)
layer2use = wear_mask.alternate_worn_layer
if(!layer2use)
layer2use = FACEMASK_LAYER
var/image/standing
if(wear_mask.alternate_worn_icon)
standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
if(!standing)
standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
var/image/standing
if(wear_mask.alternate_worn_icon)
standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
if(!standing)
standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
overlays_standing[FACEMASK_LAYER] = standing
overlays_standing[FACEMASK_LAYER] = standing
if(wear_mask.blood_DNA && (wear_mask.body_parts_covered & HEAD))
standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
if(wear_mask.blood_DNA && (wear_mask.body_parts_covered & HEAD))
standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
return wear_mask
/mob/living/carbon/update_inv_back()
-3
View File
@@ -577,9 +577,6 @@ Sorry Giacom. Please don't be mad :(
// It's ugly. But everything related to inventory/storage is. -- c0
s_active.close(src)
for(var/mob/living/simple_animal/slime/M in oview(1,src))
M.UpdateFeed(src)
/mob/living/proc/makeTrail(turf/T, mob/living/M)
if(!has_gravity(M))
return
+3 -1
View File
@@ -199,7 +199,9 @@
M << "You cannot attack people before the game has started."
return
if(M.Victim)
if(M.buckled)
if(M == buckled_mob)
M.Feedstop()
return // can't attack while eating!
if (stat != DEAD)
+3
View File
@@ -840,3 +840,6 @@ var/list/ai_list = list()
if(W.force && W.damtype != STAMINA && src.stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
return ..()
/mob/living/silicon/ai/can_buckle()
return 0
@@ -100,7 +100,7 @@
projectilesound = 'sound/weapons/Gunshot_smg.ogg'
projectiletype = /obj/item/projectile/bullet/midbullet2
weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r
weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted
/mob/living/simple_animal/hostile/syndicate/ranged/space
icon_state = "syndicaterangedpsace"
@@ -140,4 +140,4 @@
..(gibbed)
visible_message("<span class='danger'><b>[src]</b> is smashed into pieces!</span>")
qdel(src)
return
return
@@ -57,6 +57,8 @@
return 0
if(istype(A,/obj/singularity))
return 0
if(istype(A,/mob/living/simple_animal/hostile/morph))
return 0
return 1
/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A)
@@ -181,7 +181,7 @@
/mob/living/simple_animal/parrot/Topic(href, href_list)
//Can the usr physically do this?
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
if(usr.incapacitated() || !usr.Adjacent(loc))
return
//Is the usr's mob type able to do this? (lolaliens)
@@ -480,7 +480,7 @@
parrot_state = PARROT_SWOOP | PARROT_RETURN
return
if(in_range(src, parrot_interest))
if(Adjacent(parrot_interest))
if(isliving(parrot_interest))
steal_from_mob()
@@ -508,7 +508,7 @@
parrot_state = PARROT_WANDER
return
if(in_range(src, parrot_perch))
if(Adjacent(parrot_perch))
src.loc = parrot_perch.loc
drop_held_item()
parrot_state = PARROT_PERCH
@@ -548,7 +548,7 @@
a_intent = "harm"
//If the mob is close enough to interact with
if(in_range(src, parrot_interest))
if(Adjacent(parrot_interest))
//If the mob we've been chasing/attacking dies or falls into crit, check for loot!
if(L.stat)
@@ -43,6 +43,7 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 0, CLONE = 0, STAMINA = 1, OXY = 0) //Set 0 to receive that damage type, 1 to ignore
var/attacktext = "attacks"
@@ -15,6 +15,9 @@
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(buckled)
Feedstop(silent=1) //releases ourselves from the mob we fed on.
stat = DEAD
overlays.len = 0
@@ -14,6 +14,8 @@
if (notransform)
return
if(..())
if(buckled)
handle_feeding()
handle_nutrition()
handle_targets()
if (!ckey)
@@ -32,8 +34,8 @@
AIproc = 1
while(AIproc && stat != DEAD && (attacked || hungry || rabid || Victim))
if(Victim) // can't eat AND have this little process at the same time
while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled))
if(buckled) // can't eat AND have this little process at the same time
break
if(!Target || client)
@@ -45,11 +47,10 @@
break
if(Target)
for(var/mob/living/simple_animal/slime/M in view(1,Target))
if(M.Victim == Target)
Target = null
AIproc = 0
break
if(isslime(Target.buckled_mob))
Target = null
AIproc = 0
break
if(!AIproc)
break
@@ -148,11 +149,65 @@
return temp_change
/mob/living/simple_animal/slime/handle_regular_status_updates()
if(..())
if(prob(30))
adjustBruteLoss(-1)
/mob/living/simple_animal/slime/proc/handle_feeding()
if(!ismob(buckled))
return
var/mob/M = buckled
if(M.stat == DEAD) // our victim died
if(!client)
if(!rabid && !attacked)
if(M.LAssailant && M.LAssailant != M)
if(prob(50))
if(!(M.LAssailant in Friends))
Friends[M.LAssailant] = 1
else
++Friends[M.LAssailant]
else
src << "<i>This subject does not have a strong enough life energy anymore...</i>"
if(M.client && ishuman(M))
if(prob(85))
rabid = 1 //we go rabid after finishing to feed on a human with a client.
Feedstop()
return
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjustCloneLoss(rand(2,4))
C.adjustToxLoss(rand(1,2))
if(prob(10) && C.client)
C << "<span class='userdanger'>[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
"A low, rolling pain passes through your body!", \
"Your body feels as if it's falling apart!", \
"You feel extremely weak!", \
"A sharp, deep pain bathes every inch of your body!")]</span>"
else if(isanimal(M))
var/mob/living/simple_animal/SA = M
SA.adjustBruteLoss(is_adult ? rand(4, 7) : rand(3, 4))
else
src << "<span class='warning'>[pick("This subject is incompatible", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]!</span>"
Feedstop()
return
add_nutrition(rand(7,15))
//Heal yourself.
adjustBruteLoss(-3)
/mob/living/simple_animal/slime/proc/handle_nutrition()
if(docile) //God as my witness, I will never go hungry again
@@ -171,27 +226,29 @@
nutrition -= 20
amount_grown++
if(amount_grown >= 10 && !Victim && !Target && !ckey)
if(amount_grown >= 10 && !buckled && !Target && !ckey)
if(is_adult)
Reproduce()
else
Evolve()
/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0, lastnut = 0)
/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0)
nutrition = min((nutrition + nutrition_to_add), get_max_nutrition())
if(nutrition >= (lastnut + 50))
if(prob(80))
lastnut = nutrition
powerlevel++
if(powerlevel > 10)
powerlevel = 10
adjustBruteLoss(-10)
if(nutrition >= get_grow_nutrition())
if(powerlevel<10)
if(prob(30-powerlevel*2))
powerlevel++
else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level.
if(powerlevel<5)
if(prob(25-powerlevel*5))
powerlevel++
/mob/living/simple_animal/slime/proc/handle_targets()
if(Tempstun)
if(!Victim) // not while they're eating!
if(!buckled) // not while they're eating!
canmove = 0
else
canmove = 1
@@ -212,7 +269,7 @@
if(!client)
if(!canmove) return
if(Victim) return // if it's eating someone already, continue eating!
if(buckled) return // if it's eating someone already, continue eating!
if(Target)
--target_patience
@@ -254,13 +311,8 @@
if(src.type in H.dna.species.ignored_by)
continue
if(!L.canmove) // Only one slime can latch on at a time.
var/notarget = 0
for(var/mob/living/simple_animal/slime/M in view(1,L))
if(M.Victim == L)
notarget = 1
if(notarget)
continue
if(isslime(L.buckled_mob)) // Only one slime can latch on at a time.
continue
targets += L // Possible target found!
@@ -361,9 +413,9 @@
else // Not friendly enough
to_say = pick("No...", "I won't follow...")
else if (findtext(phrase, "stop"))
if (Victim) // We are asked to stop feeding
if (buckled) // We are asked to stop feeding
if (Friends[who] > 4)
Victim = null
Feedstop()
Target = null
if (Friends[who] < 7)
--Friends[who]
@@ -457,7 +509,7 @@
if (bodytemperature < T0C - 50)
phrases += "..."
phrases += "C... c..."
if (Victim)
if (buckled)
phrases += "Nom..."
phrases += "Tasty..."
if (powerlevel > 3) phrases += "Bzzz..."
@@ -20,129 +20,44 @@
if(!Adjacent(M))
return 0
if(Victim)
if(buckled)
Feedstop()
return 0
if(isslime(M))
src << "<i>I can't latch onto another slime...</i>"
src << "<span class='warning'><i>I can't latch onto another slime...</i></span>"
return 0
if(docile)
src << "<i>I'm not hungry anymore...</i>"
src << "<span class='notice'><i>I'm not hungry anymore...</i></span>"
return 0
if(stat)
src << "<i>I must be conscious to do this...</i>"
src << "<span class='warning'><i>I must be conscious to do this...</i></span>"
return 0
if(M.stat == DEAD)
src << "<i>This subject does not have a strong enough life energy...</i>"
src << "<span class='warning'><i>This subject does not have a strong enough life energy...</i></span>"
return 0
for(var/mob/living/simple_animal/slime/met in view())
if(met.Victim == M && met != src)
src << "<i>The [met.name] is already feeding on this subject...</i>"
return 0
if(isslime(M.buckled_mob))
src << "<span class='warning'><i>Another slime is already feeding on this subject...</i></span>"
return 0
return 1
/mob/living/simple_animal/slime/proc/Feedon(mob/living/M)
if(M.buckle_mob(src, force=1))
M.visible_message("<span class='danger'>The [name] has latched onto [M]!</span>", \
"<span class='userdanger'>The [name] has latched onto [M]!</span>")
else
src << "<span class='warning'><i>I have failed to latch onto the subject</i></span>"
src << "<span class='notice'><i>I have latched onto the subject and begun feeding...</i></span>"
M << "<span class='userdanger'>The [name] has latched onto [M.name]!</span>"
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
var/fed_succesfully = 0
while(Victim && Victim == M && Victim.stat != DEAD && stat != DEAD)
canmove = 0
if(Adjacent(Victim))
loc = M.loc
if(iscarbon(Victim))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4))
if(prob(15) && Victim.client)
Victim << "<span class='userdanger'>[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
"A low, rolling pain passes through your body!", \
"Your body feels as if it's falling apart!", \
"You feel extremely weak!", \
"A sharp, deep pain bathes every inch of your body!")]</span>"
fed_succesfully = 1
else if(isanimal(Victim)) //we already know it's a simple_animal from above
Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
fed_succesfully = 1
else
src << "<span class='warning'>[pick("This subject is incompatible", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]!</span>"
if(fed_succesfully)
add_nutrition(rand(15,30), lastnut)
//Heal yourself.
adjustBruteLoss(-10)
updatehealth()
if(Victim)
Victim.updatehealth()
sleep(rand(15,45))
else
break
canmove = 1
anchored = 0
if(M && M.stat == DEAD)
if(!client)
if(Victim && !rabid && !attacked)
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
if(!(Victim.LAssailant in Friends))
Friends[Victim.LAssailant] = 1
else
++Friends[Victim.LAssailant]
if(M.client && ishuman(M))
if(prob(85))
rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
if(client)
src << "<i>This subject does not have a strong enough life energy anymore...</i>"
else if(client)
src << "<i>I have stopped feeding...</i>"
Victim = null
/mob/living/simple_animal/slime/proc/Feedstop()
if(Victim)
if(Victim.client)
Victim << "[src] has let go of your head!"
Victim = null
/mob/living/simple_animal/slime/proc/UpdateFeed(mob/M)
if(Victim)
if(Victim == M)
loc = M.loc // simple "attach to head" effect!
/mob/living/simple_animal/slime/proc/Feedstop(silent=0)
if(buckled)
if(!silent)
visible_message("<span class='warning'>[src] has let go of [buckled]!</span>", \
"<span class='notice'><i>I stopped feeding.</i></span>")
buckled.unbuckle_mob(force=1)
/mob/living/simple_animal/slime/verb/Evolve()
set category = "Slime"
@@ -48,7 +48,6 @@
var/number = 0 // Used to understand when someone is talking to it
var/mob/living/Victim = null // the person the slime is currently feeding on
var/mob/living/Target = null // AI variable - tells the slime to hunt this down
var/mob/living/Leader = null // AI variable - tells the slime to follow this person
@@ -178,7 +177,7 @@
..()
/mob/living/simple_animal/slime/MouseDrop(atom/movable/A as mob|obj)
if(isliving(A) && A != src)
if(isliving(A) && A != src && usr == src)
var/mob/living/Food = A
if(CanFeedon(Food))
Feedon(Food)
@@ -197,8 +196,8 @@
if(..()) //successful slime attack
if(M == src)
return
if(Victim)
Victim = null
if(buckled)
Feedstop(silent=1)
visible_message("<span class='danger'>[M] pulls [src] off!</span>")
return
attacked += 5
@@ -229,8 +228,8 @@
/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M)
if(Victim)
if(Victim == M)
if(buckled)
if(buckled == M)
if(prob(60))
visible_message("<span class='warning'>[M] attempts to wrestle \the [name] off!</span>")
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -244,11 +243,11 @@
else
M.do_attack_animation(src)
if(prob(30))
visible_message("<span class='warning'>[M] attempts to wrestle \the [name] off of [Victim]!</span>")
visible_message("<span class='warning'>[M] attempts to wrestle \the [name] off of [buckled]!</span>")
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
visible_message("<span class='warning'>[M] manages to wrestle \the [name] off of [Victim]!</span>")
visible_message("<span class='warning'>[M] manages to wrestle \the [name] off of [buckled]!</span>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
discipline_slime(M)
@@ -357,10 +356,10 @@
if(Discipline == 1)
attacked = 0
if(Victim || Target)
Victim = null
if(Target)
Target = null
anchored = 0
if(buckled)
Feedstop(silent=1) //we unbuckle the slime from the mob it latched onto.
spawn(0)
SStun = 1
@@ -378,3 +377,13 @@
/mob/living/simple_animal/slime/pet
docile = 1
/mob/living/simple_animal/slime/can_unbuckle()
return 0
/mob/living/simple_animal/slime/can_buckle()
return 0
/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat)
if(..())
return 3
+17 -3
View File
@@ -981,7 +981,7 @@ var/list/slot_equipment_priority = list( \
dir = angle2dir(rotation+dir2angle(dir))
//You can buckle on mobs if you're next to them since most are dense
/mob/buckle_mob(mob/living/M)
/mob/buckle_mob(mob/living/M, force = 0)
if(M.buckled)
return 0
var/turf/T = get_turf(src)
@@ -997,12 +997,26 @@ var/list/slot_equipment_priority = list( \
//Default buckling shift visual for mobs
/mob/post_buckle_mob(mob/living/M)
if(M == buckled_mob) //post buckling
M.pixel_y = initial(M.pixel_y) + 9
var/height = M.get_mob_buckling_height(src)
M.pixel_y = initial(M.pixel_y) + height
if(M.layer < layer)
M.layer = layer + 0.1
else //post unbuckling
M.layer = initial(M.layer)
M.pixel_y = initial(M.pixel_y)
/mob/proc/can_unbuckle(mob/user)
//returns the height in pixel the mob should have when buckled to another mob.
/mob/proc/get_mob_buckling_height(mob/seat)
if(isliving(seat))
var/mob/living/L = seat
if(L.mob_size <= MOB_SIZE_SMALL) //being on top of a small mob doesn't put you very high.
return 0
return 9
//can the mob be buckled to something by default?
/mob/proc/can_buckle()
return 1
//can the mob be unbuckled from something by default?
/mob/proc/can_unbuckle()
return 1
+1 -1
View File
@@ -25,7 +25,7 @@
/obj/singularity/narsie/large/New()
..()
world << "<font size='15' color='red'><b>NAR-SIE HAS RISEN</b></font>"
world << 'sound/effects/narsie.ogg'
world << pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg')
var/area/A = get_area(src)
if(A)
+7 -4
View File
@@ -203,6 +203,8 @@
if(burst_size > 1)
for(var/i = 1 to burst_size)
if(!user)
break
if(!issilicon(user))
if( i>1 && !(src in get_both_hands(user))) //for burst firing
break
@@ -240,10 +242,11 @@
spawn(fire_delay)
semicd = 0
if(user.hand)
user.update_inv_l_hand()
else
user.update_inv_r_hand()
if(user)
if(user.hand)
user.update_inv_l_hand()
else
user.update_inv_r_hand()
feedback_add_details("gun_fired","[src.type]")
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
+1 -1
View File
@@ -16,7 +16,7 @@
set name = "Set transfer amount"
set category = "Object"
set src in range(0)
if(usr.stat || !usr.canmove || usr.restrained())
if(usr.incapacitated())
return
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
if (N)
+1 -1
View File
@@ -106,7 +106,7 @@
/obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user)
if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
return
if(target.buckled)
if(target.buckled || target.buckled_mob)
return
if(target.mob_size > MOB_SIZE_HUMAN)
user << "<span class='warning'>[target] doesn't fit inside [src]!</span>"
@@ -11,7 +11,7 @@
materials = list(MAT_METAL = 700, MAT_GLASS = 50)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell
category = list("Misc","Power Designs")
category = list("Misc","Power Designs","Machinery","initial")
/datum/design/high_cell
name = "High-Capacity Power Cell"
@@ -32,7 +32,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/weapon/stock_parts/capacitor
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
/datum/design/adv_capacitor
name = "Advanced Capacitor"
@@ -75,7 +75,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/scanning_module
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
/datum/design/adv_scanning
name = "Advanced Scanning Module"
@@ -118,7 +118,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
/datum/design/nano_mani
name = "Nano Manipulator"
@@ -161,7 +161,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/micro_laser
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
/datum/design/high_micro_laser
name = "High-Power Micro-Laser"
@@ -203,7 +203,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
/datum/design/adv_matter_bin
name = "Advanced Matter Bin"
@@ -306,4 +306,4 @@
build_type = PROTOLATHE
materials = list(MAT_GLASS = 100, MAT_SILVER = 10, MAT_URANIUM = 15)
build_path = /obj/item/weapon/stock_parts/subspace/transmitter
category = list("Stock Parts")
category = list("Stock Parts")
+12 -16
View File
@@ -457,27 +457,23 @@
visible_message("<span class='danger'>[src]'s crusher goes way too many levels too high, crushing right through space-time!</span>")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor")
var/list/throwAt = list()
for(var/i in oview(7,src))
if(istype(i,/obj/item) || istype(i,/mob/living))
throwAt.Add(i)
var/counter
for(counter = 1, counter < throwAt.len, ++counter)
var/cast = throwAt[counter]
cast:throw_at(src,10,1)
spawn(0)
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
AM.throw_at(src,10,1)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='danger'>[src]'s crusher goes one level too high, crushing right into space-time!</span>")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
investigate_log("Experimentor has triggered the 'minor throw things' reaction.", "experimentor")
var/list/oViewStuff = oview(7,src)
var/list/throwAt = list()
for(var/i in oViewStuff)
if(istype(i,/obj/item) || istype(i,/mob/living))
throwAt.Add(i)
var/counter
for(counter = 1, counter < throwAt.len, ++counter)
var/cast = throwAt[counter]
cast:throw_at(pick(throwAt),10,1)
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
throwAt.Add(AM)
spawn(0)
for(var/counter = 1, counter < throwAt.len, ++counter)
var/atom/movable/cast = throwAt[counter]
cast.throw_at(pick(throwAt),10,1)
ejectItem(TRUE)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == FAIL)
+1 -1
View File
@@ -608,7 +608,7 @@
return
cooldown = 1
usr << "<span class='notice'>Your request has been recieved by Centcom.</span>"
admins << "<b>FERRY: <font color='blue'>[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) (<A HREF='?_src_=holder;secretsadmin=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>"
admins << "<b>FERRY: <font color='blue'>[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) (<A HREF='?_src_=holder;secrets=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>"
spawn(600) //One minute cooldown
cooldown = 0